我正在使用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()
内打印消息;但我宁愿在父模块中执行此操作。
这是 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
(