Python多处理得到了结果

Python多处理得到了结果,python,Python,我试图理解Python多处理模块。下面的代码创建4个进程并尝试运行函数f(x) 问题 我创建了4个流程,但提交了多个任务(f[10])。模块是否会在任何时候自动每4个进程运行一次 我将结果记录在一个列表中。pool.apply\u async将返回什么,是作业中的打印语句还是该方法返回的任何内容 当我执行这段代码时,它只显示100,而不显示其他值 from multiprocessing import Pool def f(x): print x*x return x*x

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

问题

  • 我创建了4个流程,但提交了多个任务(f[10])。模块是否会在任何时候自动每4个进程运行一次
  • 我将结果记录在一个列表中。
    pool.apply\u 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)   
    

    您创建的池有4个可用进程。然后,你给它一个单一的工作做,它农场出来,它的4名工人之一。如果你给它更多的工作,它将使用更多的工人。

    你实际上只提交了一个任务:函数
    f
    和参数tuple
    (10,)
    ,这意味着你只是在一个工人中执行
    f(10)
    。如果您实际提交了4个以上的进程,则
    池将始终同时执行最多4个任务。一个任务完成后,将启动一个挂起的任务来替换它,直到没有剩余的任务为止。还请注意,相同的四个过程将在整个过程中使用;它们在完成任务后不会重新启动,除非在创建
    池时提供
    maxtasksparchild
    关键字参数


    apply\u async
    将返回一个对象,一旦该对象可用,该对象可用于获取任务的结果。您可以通过调用
    AsyncResult
    对象上的
    get()
    来实现这一点,因此
    out
    列表将包含对
    f
    的一次调用的返回值。您在worker进程中打印的内容将显示在stdou中,这与您在主进程中运行时的情况不同,但不会在任何地方被捕获。

    您所有的问题都在文档中得到了回答:所以,在我的例子中…我已经给出了10个作业…这是指它将同时创建10个进程,还是将运行4个进程,然后再次创建另4个进程。您可以在构造函数中定义池可用的工作进程数。该池有一个内部队列,当您通过apply_async为其提供作业时,它会将这些作业放入队列中。然后工作进程(异步)从队列中拾取作业。因此,如果你给它10个工作,那么所有4个工人都应该很忙,直到工作队列被清空。。。