我已经阅读到函数apply_async
没有给出有序的结果。如果我重复调用了一个打印数字列表的平方的函数,那么从显示中我可以看到列表没有排序。
但是,当函数返回数字而不是打印数字时,我使用.get()
获取值,那么我看到结果是有序的。
我有几个问题-
.get()
的结果是有序的?a
的变量,并且其值对于不同的迭代是不同的。使用apply_async
会导致a
的值在并行并异步运行进程时被覆盖吗?apply
而不是apply_async
,是否可以节省计算时间?我的代码显示apply
比for循环慢。为什么会这样?___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]
答案 0 :(得分:3)
- 为什么
.get()
的结果是有序的?
因为results
列表是有序的。
- 如果我有一个循环,该循环作为名为
a
的变量,并且其值对于不同的迭代是不同的。将使用apply_async
原因a
的值在并行运行进程时被覆盖 和异步?
通常不,但是我看不见代码就无法分辨。
- 如果我运行
apply
而不是apply_async
,是否可以节省计算时间?我的代码显示apply
比for慢 环。为什么会这样?
否,每次调用时apply
块,没有并行性。由于多处理的开销,apply
较慢。
- 我们可以将
___main___
函数中声明的函数与apply_async
一起使用吗?
* nix是,对于Windows,否,因为没有fork()
。
您对.apply_async
的时间测量是错误的,您应该在t2a
之后使用result.get
,并且不要假设结果按顺序完成:
while not all(r.ready() for r in results):
time.sleep(0.1)
顺便说一句,您的工作功能运行得太快而无法完成,需要做更多的计算才能得出真实的基准。