2014-10-31 68 views
0

我想了解Python多处理模块。下面的代码创建4个进程并尝试运行功能f(x)Python多处理得到结果

问题

  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) 
+0

所有的问题都在文档中得到解答:https://docs.python.org/2/library/multiprocessing.html – Wolph 2014-10-31 15:24:56

回答

1

您创建的池有4个可用的进程。然后,你可以给它一个单一的工作,并将其分配给其4个工作人员中的一个。如果你给它更多的工作,它会使用更多的工人。

+0

所以,在我的情况下......我给了10个工作......这是否意味着它将同时创建10个进程或将运行4个进程并再次创建另外4个进程。 – user1050619 2014-10-31 15:38:19

+0

您可以在构造函数中定义池中可用的工作器的数量。该池有一个内部队列,当您通过apply_async为其提供作业时,它会将这些作业放入队列中。工作进程然后从队列中选择作业(异步)。所以如果你给它10个工作,那么所有4个工人应该很忙,直到工作队列被清空。 – 2014-10-31 15:50:18

1

实际上你只在这里提交一个任务:函数f带有参数元组(10,),这意味着你只是在一个worker中执行f(10)。如果您实际提交了4个以上的进程,则Pool将始终同时执行至多4个任务。只要一个任务完成,一个待处理任务将开始替换它,直到没有剩余的任务。还要注意,整个过程将使用相同的四个过程;它们在完成任务后不会重新启动,除非在创建Pool时提供maxtasksperchild关键字参数。

apply_async将返回一个AsyncResult对象,该对象可用于在任务可用时获取任务结果。您通过在AsyncResult对象上调用get()来完成此操作,因此out列表将包含您的一个呼叫的返回值f。工作进程中的东西print将出现在标准输出中,就像它在主进程中运行它一样,但不会在任何地方捕获。