我试图了解多进程池的工作原理。在下面的编程中,我创建了一个包含4个进程的池。
我使用回调函数调用apply_async
,该函数应更新名为result_list
的列表
import Queue
from multiprocessing import Process
from multiprocessing import Pool
result_list = []
def foo_pool(q): #Function for each process
print "foo_pool"
if(q.qsize() > 0):
number = q.get()
return number * 2
def log_result(result):
# This is called whenever foo_pool(i) returns a result.
# result_list is modified only by the main process, not the pool workers.
result_list.append(result)
if __name__ == "__main__":
q = Queue.Queue()
for i in range(4):
q.put(i + 1) #Put 1..4 in the queue
p = Pool(4)
p.apply_async(foo_pool, args = (q, ), callback = log_result)
我意识到我不需要在这里使用队列。但我正在测试另一个需要我使用队列的程序。
当我运行程序时,函数foo_pool没有被调用。打印语句print "foo_pool"
不会执行。这是为什么?
答案 0 :(得分:1)
粗略地说,apply_async只安排异步任务,但不运行它。您需要致电p.close()
和p.join()
来触发执行,或r = p.apply_async()
和r.get()
。