Python multiprocessing.Pool:何时使用apply,apply_async或map?

问题:

我没有看到Pool.applyPool.apply_asyncPool.map的用例的明确示例。我主要使用Pool.map;别人有什么好处?

回答:

回到Python的旧时代,用任意参数调用函数,你可以使用apply

apply(f,args,kwargs)

 apply仍然存在于Python2.7中,而不是在Python3中,通常不再使用。如今,

f(*args,**kwargs)

是优选的。 multiprocessing.Pool模块尝试提供类似的界面。
 Pool.apply就像Python apply,除了在单独的进程中执行函数调用。 Pool.apply块,直到功能完成。
 Pool.apply_async也像Python的内置apply,除了调用立即返回,而不是等待结果。返回一个ApplyResult对象。您调用其get()方法来检索函数调用的结果。 get()方法将阻塞,直到函数完成。因此,pool.apply(func, args, kwargs)相当于pool.apply_async(func, args, kwargs).get()
Pool.apply相反,Pool.apply_async方法也有一个回调,如果提供,则在函数完成时调用。这可以用来代替get()
例如:

import multiprocessing as mp
import time

def foo_pool(x):
    time.sleep(2)
    return x*x

result_list = []
def log_result(result):
    # This is called whenever foo_pool(i) returns a result.
    # result_list is modified only by the main process, not the pool workers.
    result_list.append(result)

def apply_async_with_callback():
    pool = mp.Pool()
    for i in range(10):
        pool.apply_async(foo_pool, args = (i, ), callback = log_result)
    pool.close()
    pool.join()
    print(result_list)

if __name__ == '__main__':
    apply_async_with_callback()

可能产生如下结果

[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]

注意,与pool.map不同,结果的顺序可能与pool.apply_async调用的顺序不一致。
所以,如果你需要在一个单独的进程中运行一个函数,但是希望当前进程直到该函数返回,那么使用Pool.apply。像Pool.applyPool.map块,直到返回完成结果。
如果要让工作进程池异步执行许多函数调用,请使用Pool.apply_async。结果的订购不能保证与Pool.apply_async的呼叫顺序相同
还请注意,您可以使用Pool.apply_async调用多个不同函数(并非所有调用都需要使用相同的函数)。
相反,Pool.map对许多参数应用相同的函数。
但是,与Pool.apply_async不同,结果以与参数顺序相对应的顺序返回。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Python multiprocessing.Pool: when to use apply, apply_async or map?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 1 = 2