我读到函数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 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]
- 为什么对
.get()
的结果进行排序
因为results
列表已排序。
- 如果我有一个循环,它作为一个名为
a
的变量,并且它的值对于不同的迭代是不同的。使用apply_async
会导致在并行运行进程时覆盖a
的值并且异步
通常不会,但如果没有看到代码,我就无法判断。
- 如果我运行
apply
而不是apply_async
,我能节省计算时间吗?我的代码显示apply
比环为什么会这样
没有,每次调用都有apply
个块,没有并行性。CCD_ 21由于多处理开销而较慢。
- 我们可以将
___main___
函数中声明的函数与apply_async
一起使用吗
对于*nix是,对于windows不是,因为没有fork()
。
你对.apply_async
的时间测量是错误的,你应该在result.get
之后取t2a
,不要假设结果按顺序完成:
while not all(r.ready() for r in results):
time.sleep(0.1)
顺便说一句,你的工作函数运行得太快了,无法完成,要做更多的计算才能做一个真正的基准测试。