使用apply_async排序结果



我读到函数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 loop For loop花费的时间=5.9604644775390625e-06秒

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

[0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256289324361]

  1. 为什么对.get()的结果进行排序

因为results列表已排序。

  1. 如果我有一个循环,它作为一个名为a的变量,并且它的值对于不同的迭代是不同的。使用apply_async会导致在并行运行进程时覆盖a的值并且异步

通常不会,但如果没有看到代码,我就无法判断。

  1. 如果我运行apply而不是apply_async,我能节省计算时间吗?我的代码显示apply比环为什么会这样

没有,每次调用都有apply个块,没有并行性。CCD_ 21由于多处理开销而较慢。

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

对于*nix是,对于windows不是,因为没有fork()

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

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

顺便说一句,你的工作函数运行得太快了,无法完成,要做更多的计算才能做一个真正的基准测试。

相关内容

  • 没有找到相关文章

最新更新