如何打印/记录进程中的子进程?

时间:2018-01-29 20:35:48

标签: python multiprocessing

我正在使用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()内打印消息;但我宁愿在父模块中这样做。

1 个答案:

答案 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