关于ZAKER 融媒体解决方案 合作 加入

python – multiprocessing.Pool:何时使用 apply,a.

CocoaChina 09-20

回到 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, 除了调用立即返回而不是等待结果 . 返回 AsyncResult 对象 . 您调用其 get ( ) 方法来检索函数调用的结果 . get ( ) 方法一直阻塞 , 直到函数完成 . 因此 ,pool.apply ( func,args,kwargs ) 等同于 pool.apply_async ( func,args,kwargs ) .get ( ) .

与 Pool.apply 相比 ,Pool.apply_async 方法也有一个回调 , 如果提供 , 则在函数完成时调用 . 这可以用来代替调用 get ( ) .

例如:

import multiprocessing as mpimport timedef foo_pool ( x ) : time.sleep ( 2 ) return x*xresult_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.apply 一样 ,Pool.map 会阻塞 , 直到返回完整的结果 .

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

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

相反 ,Pool.map 将相同的函数应用于许多参数 .

但是 , 与 Pool.apply_async 不同 , 结果以与参数顺序对应的顺序返回 .

以上内容由"CocoaChina"上传发布 查看原文
相关标签 python

觉得文章不错,微信扫描分享好友

扫码分享