Как передать ссылку на функцию, управляемую pool.map_async ()?

37
задан tburrows13 22 March 2017 в 20:20
поделиться

2 ответа

Следующий код, кажется, работает:

import multiprocessing, time

def task(args):
    count = args[0]
    queue = args[1]
    for i in xrange(count):
        queue.put("%d mississippi" % i)
    return "Done"


def main():
    manager = multiprocessing.Manager()
    q = manager.Queue()
    pool = multiprocessing.Pool()
    result = pool.map_async(task, [(x, q) for x in range(10)])
    time.sleep(1)
    while not q.empty():
        print q.get()
    print result.get()

if __name__ == "__main__":
    main()

Обратите внимание, что очередь получена из manager.Queue(), а не из multiprocessing.Queue(). Спасибо Алексу за то, что указал мне на это направление.

45
ответ дан 27 November 2019 в 04:51
поделиться

Создание q global работает...:

import multiprocessing, time

q = multiprocessing.Queue()

def task(count):
    for i in xrange(count):
        q.put("%d mississippi" % i)
    return "Done"

def main():
    pool = multiprocessing.Pool()
    result = pool.map_async(task, range(10))
    time.sleep(1)
    while not q.empty():
        print q.get()
    print result.get()

if __name__ == "__main__":
    main()

Если вам нужно несколько очередей, например, чтобы не смешивать прогресс различных процессов пула, глобальный список очередей должен работать (конечно, каждый процесс должен будет знать, какой индекс в списке использовать, но это можно передать как аргумент;-).

8
ответ дан 27 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: