Python 多进程如何获取结果
我正在尝试理解Python的多进程模块。下面的代码创建了4个进程,并试图运行函数f(x)
。
问题
- 我创建了4个进程,但提交了多个任务(f,[10])。这个模块会自动在任何时间运行这4个进程吗?
- 我把结果保存在一个列表里。
pool.apply_async
会返回什么?是工作中的打印语句,还是方法返回的其他内容?
当我执行这段代码时,它只显示了100,而没有其他值。
from multiprocessing import Pool
def f(x):
print x*x
return x*x
if __name__ == '__main__':
result = []
pool = Pool(processes=4)
result.append(pool.apply_async(f, [10]))
out = map(lambda x: x.get(), result)
2 个回答
1
其实你这里只提交了一个任务:就是函数 f
和参数元组 (10,)
,这意味着你只是让一个工作进程去执行 f(10)
。如果你提交的任务超过了4个,Pool
最多只会同时执行4个任务。等其中一个任务完成后,就会开始下一个待处理的任务,直到所有任务都完成为止。还要注意,这四个进程在整个过程中都是同样的,不会在完成任务后重启,除非你在创建 Pool
时提供了 maxtasksperchild
这个参数。
apply_async
会返回一个 AsyncResult
对象,这个对象可以用来获取任务的结果,一旦结果准备好了。你可以通过在 AsyncResult
对象上调用 get()
来获取结果,所以 out
列表里会包含你对 f
的那次调用的返回值。在工作进程中用 print
打印的内容会像在主进程中运行时一样出现在标准输出中,但这些内容不会被记录到任何地方。
1
你创建的这个池子里有4个可以工作的进程。然后你给它一个任务,它会把这个任务分配给4个工人中的一个。如果你给它更多的任务,它就会使用更多的工人来完成这些任务。