标签:__ multiporcessing pool async 进程 apply Pool
官方文档中使用multiprocessing.Pool的例子如下:
from multiprocessing import Pool def f(x): print(x*x) return x*x def test(): with Pool(processes=4) as pool: # start 4 worker processes result = pool.apply_async(f, (10,)) # evaluate "f(10)" asynchronously in a single process ——参考博客 print(result.get(timeout=1)) if __name__ == '__main__': test() # 100 # 100
有几个注意点:
1)子进程和主进程的变量是不共享的(多线程的可以共享);子进程会将主进程的全局变量copy一份,但子进程中对全局变量的修改不影响其它进程,所以全局变量最好是只读的那种,否则也没法一起修改。——参考so
可以通过Manager实现变量共享(参考博客),但这个也无法绕过下面问题(3)
2)若在执行多线程功能前使用了pickle,则子进程很可能会无法执行,出现错误:Pool not running 或 _io.BufferReadError 等问题
3)子进程在OS看来是一个文件,根据SO该文件的描述子不能超过ulimit(1024),描述子包括函数参数部分,所以子进程函数的参数不能太大,否则子进程无法执行,出现错误:...OSError: [Errno 24] Too many open files ...(子进程数太多也会出现这个问题)
apply_async的特点是:执行后立即返回,而不等待结果。也就是说,若目标函数不能立即执行完,则该子进程可能执行到一半就阻塞了,没有返回的结果。加了callback也不一定有用。——参考博客
若和get()一起使用就必定能得到结果,但就没有并行的效果了。
关于apply_async不执行也不报错的问题,根据博客的解释,报错需要用error_callback来承接,否则不会显式报错。
对于子进程无法执行立即得到结果的情况,要注意不用 with,因为 with 的block结束了,会导致pool也异常结束。
# 1. stuck after with with multiprocessing.Pool(processes=32) as pool: pool.apply_async() ... pool.close() # pool does not exist after with finished pool.join()
# 2. ok pool = multiprocessing.Pool(processes=32) pool.apply_async() pool.close() pool.join()
标签:__,multiporcessing,pool,async,进程,apply,Pool 来源: https://www.cnblogs.com/grainrain/p/16364041.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。