我还没有看到Pool.apply、Pool.apply\u async和Pool.map使用案例的清晰示例。我主要使用Pool.map
;其他人的优势是什么
回到Python的旧时代,要使用任意参数调用函数,可以使用apply
:
应用(f、args、kwargs)
apply
在Python2.7中仍然存在,但在Python3中没有,并且通常不再使用。如今,
f(*args,**kwargs)
是首选。多处理.Pool
模块试图提供类似的接口
Pool.apply
类似于Pythonapply
,只是函数调用是在单独的进程中执行的池。应用块,直到功能完成
Pool.apply\u async
也类似于Python内置的apply
,只是调用会立即返回,而不是等待结果。返回一个AsyncResult
对象。您可以调用它的get()
方法来检索函数调用的结果。get()
方法阻塞,直到函数完成。因此,pool.apply(func,args,kwargs)
相当于pool.apply\u async(func,args,kwargs).get()
与Pool.apply
不同,Pool.apply\u async
方法还有一个回调函数,如果提供了回调函数,则在函数完成时调用。这可以用来代替调用get()
例如:
将多处理作为mp导入
导入时间
def foo_池(x):
时间。睡眠(2)
返回x*x
结果_列表=[]
def日志_结果(结果):
#只要foo_pool(i)返回结果,就会调用该函数。
#结果_列表仅由主进程修改,而不是池工作人员修改。
结果\u列表。追加(结果)
def apply_async_with_callback():
pool=mp.pool()
对于范围(10)内的i:
apply\u async(foo\u pool,args=(i,),callback=log\u result)
pool.close()
pool.join()
打印(结果列表)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
使用回调()应用异步
可能产生如下结果:
[1,0,4,9,25,16,49,36,81,64]
注意,与pool.map
不同,结果的顺序可能与pool.apply\u async
调用的顺序不一致
因此,如果需要在单独的进程中运行函数,但希望当前进程在该函数返回之前阻止,请使用Pool.apply
。像Pool.apply
,Pool.map
阻塞,直到返回完整的结果
如果希望工作进程池异步执行许多函数调用,请使用Pool.apply\u async
。结果的顺序不保证与调用池的顺序相同。应用异步
还请注意,您可以使用池调用许多不同的函数。apply_async
(并非所有调用都需要使用相同的函数)
相反,Pool.map
对许多参数应用相同的函数。
但是,与Pool.apply_async不同,结果的返回顺序与参数的顺序相对应