Python 多进程如何获取结果

0 投票
2 回答
1877 浏览
提问于 2025-04-30 21:26

我正在尝试理解Python的多进程模块。下面的代码创建了4个进程,并试图运行函数f(x)

问题

  1. 我创建了4个进程,但提交了多个任务(f,[10])。这个模块会自动在任何时间运行这4个进程吗?
  2. 我把结果保存在一个列表里。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个工人中的一个。如果你给它更多的任务,它就会使用更多的工人来完成这些任务。

撰写回答