如何打印/记录进程中的子项已完成



我正在使用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(

最新更新