ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

multiporcessing与apply_async

2022-06-10 18:08:24  阅读:129  来源: 互联网

标签:__ 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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有