我正在使用python的multiprocessing.Process
进行并行化;有没有一种简单的方法可以找出每个孩子的工作何时完成?例如,这就是我目前实现代码的方式:
def func(k):
print(42*k)
q = mp.Queue()
processes = [mp.Process(target=func, args=(k, q)) for k in keys)]
for p in processes:
p.start() # start each
for p in processes:
p.join() # wait for all to come back
result = [q.get() for _ in processes] # collect
当每个孩子加入父母时,我想要的是print "{} done".format(k)
。
为什么我要这个?我的几个进程比其他进程花费的时间更长,因此我希望在所有进程返回之前看到它们已完成或未完成。最简单(但不是那么干净)的解决方案是在func()
内打印消息;但我宁愿在父模块中这样做。
答案 0 :(得分:0)
这是concurrent.futures的一项工作 - https://docs.python.org/3/library/concurrent.futures.html
加入并发任务有很多微妙的事情,还有很多需要改进的地方,比如拥有一个与你机器上的内核数量相匹配的工作流程池,并重用这些流程 -
concurrent.futures
允许选择使用线程或进程来执行每个任务。
所以,你想要的是:
In [19]: import concurrent.futures, time, random
...: executor = concurrent.futures.ThreadPoolExecutor(4)
...: def func(n):
...: time.sleep(random.random())
...: return n
...: futures = [executor.submit(func, i ) for i in range(10)]
...:
...:
In [20]: for fut in concurrent.futures.as_completed(futures):
...: print(fut.result())
...:
6
3
7
5
2
8
4
9
0
1
(我使用ThreadPoolExecutor以便在此处运行交互式解释器 - 您将需要使用concurrent.futures.ProcessPollExecutor
)