Многопроцессорное разделение задач

У меня есть две разные задачи, которые я хочу разделить между процессами. У меня есть одна задача, которая состоит из получения ответов с URL-адресов и записи ответов в Queue (многопроцессорная очередь, а не многопоточность), над которой я хотел бы, чтобы несколько процессов работали параллельно.

У меня есть другая задача, которая ожидает, пока Queue получит данные ответа, извлекает из него ответы и записывает в файл. Я хочу, чтобы один процесс работал над этим.

Проблема в том, что если я запущу пул процессов, работающих над обращением к URL-адресам, процессы записи не запустятся, пока не будут выполнены все процессы. Как мне запустить пул процессов, чтобы попасть по URL-адресам и запустить процесс для записи в файл одновременно/один за другим?

Мой код:

CSV = CHANNEL + ".csv"
    response_queue = Queue()

    urls = []
    for row in read_channel_data(CSV):
        url = "https://some_domain/%s" % row[1]
        urls.append(url)

    # This process will start and wait for response_queue to fill up inside func
    write_process = Process(target=func, args=(response_queue,))
    write_process.start()
    write_process.join()

    # This never starts
    pool = Pool(processes=PROCESSES)
    pool.map_async(get_data, urls)
    pool.close()
    pool.join()

person Jonfor    schedule 10.03.2015    source источник


Ответы (1)


Просто переместите вызов на write_process.join() до вызова pool.join(). Вызов join блокируется до тех пор, пока не завершится func, чего не произойдет, пока не запустится pool. Поэтому просто позвоните start и отложите вызов join, пока не сможете запустить код pool.

person dano    schedule 10.03.2015