多处理池:何时使用apply、apply\u async或map?

我还没有看到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.applyPool.map阻塞,直到返回完整的结果

如果希望工作进程池异步执行许多函数调用,请使用Pool.apply\u async。结果的顺序不保证与调用池的顺序相同。应用异步

还请注意,您可以使用池调用许多不同的函数。apply_async(并非所有调用都需要使用相同的函数)

相反,Pool.map对许多参数应用相同的函数。
但是,与Pool.apply_async
不同,结果的返回顺序与参数的顺序相对应

发表评论