使用apply_async的有序结果

时间:2018-11-21 07:08:38

标签: python-3.x multiprocessing apply python-multiprocessing

我已经阅读到函数apply_async没有给出有序的结果。如果我重复调用了一个打印数字列表的平方的函数,那么从显示中我可以看到列表没有排序。

但是,当函数返回数字而不是打印数字时,我使用.get()获取值,那么我看到结果是有序的。

我有几个问题-

  1. 为什么.get()的结果是有序的?
  2. 如果我有一个循环,该循环作为名为a的变量,并且其值对于不同的迭代是不同的。使用apply_async会导致a的值在并行并异步运行进程时被覆盖吗?
  3. 如果我运行apply而不是apply_async,是否可以节省计算时间?我的代码显示apply比for循环慢。为什么会这样?
  4. 我们可以将___main___函数中声明的函数与apply_async一起使用吗?

这是一个小的工作示例:

from multiprocessing import Pool
import time

def f(x):
    return x*x

if __name__ == '__main__':

    print('For loop')
    t1f = time.time()
    for ii in range(20):
        f(ii)
    t2f = time.time()    
    print('Time taken for For loop = ', t2f-t1f,' seconds')

    pool = Pool(processes=4)
    print('Apply async loop')
    t1a = time.time()
    results = [pool.apply_async(f, args = (j,)) for j in range(20)]

    pool.close()
    pool.join()
    t2a = time.time()    
    print('Time taken for pool = ', t2a-t1a,' seconds')
    print([results[hh].get() for hh in range(len(results))])

结果为:

  

For循环For循环所需的时间= 5.9604644775390625625e-06秒

     

应用异步循环池所需的时间= 0.10188460350036621秒

     

[0、1、4、9、16、25、36、49、64、81、100、121、144、169、196、225,   256、289、324、361]

1 个答案:

答案 0 :(得分:3)

  
      
  1. 为什么.get()的结果是有序的?
  2.   

因为results列表是有序的。

  
      
  1. 如果我有一个循环,该循环作为名为a的变量,并且其值对于不同的迭代是不同的。将使用apply_async原因   a的值在并行运行进程时被覆盖   和异步?
  2.   

通常不,但是我看不见代码就无法分辨。

  
      
  1. 如果我运行apply而不是apply_async,是否可以节省计算时间?我的代码显示apply比for慢   环。为什么会这样?
  2.   

否,每次调用时apply块,没有并行性。由于多处理的开销,apply较慢。

  
      
  1. 我们可以将___main___函数中声明的函数与apply_async一起使用吗?
  2.   

* nix是,对于Windows,否,因为没有fork()

您对.apply_async的时间测量是错误的,您应该在t2a之后使用result.get,并且不要假设结果按顺序完成:

while not all(r.ready() for r in results):
    time.sleep(0.1)

顺便说一句,您的工作功能运行得太快而无法完成,需要做更多的计算才能得出真实的基准。