python 在类里使用进程池

本文探讨了进程池和线程池在Python多线程编程中的合理使用方法,指出进程池不宜作为类的局部变量,而应在if__name__==__main__条件下初始化。文章还讨论了线程池apply_async方法使用self.xxx方法时的错误,并提供了通过globals()和__main__.po获取进程池对象的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 首先, 进程池的作用就是减少进程的创建和释放 开销的, 所以在类中作为局部变量是不合适的;
  2. 其次, 进程池必须在if __name__ == "__main__"里 ,否则会报 frozen_ 什么什么的错误;(这一点可能解释有误);
  3. 然后, 线程池的apply_async 中如果传入self.xxx方法,会报multiprocessing.Pool pickling error什么的错误, 具体解释见 https://blog.youkuaiyun.com/dutsoft/article/details/70336462 , 里面有解决方法,但是我没有成功;

由于第1点 不合理, 所以有什么办法在类 函数中获取 进程池对象po的地址:


10769157-79da0bc14918ba12.png
image.png

我的解决思路和方法是:

  1. 通过globals() 取得全局变量 , 测试证明 :不同文件的globals()是不同的: 如Tab2.pyglobals()main_extra_func_file.py中的 globals()是不同的 , 所以 这样在Tab2.py中取不到po对象;
  2. 通过__main__.po 来获取 (为什么会想到这个呢, 因为有时候导包 import .xxx 和import xxx 会报 __main__ 没有什么属性什么的):
def getPoolObject():
    # po 的名字在main函数中定义
    #  __main__ 模块在sys.modules 的键是"__mp_main__"
    return sys.modules["__mp_main__"].po

ps : (图没截好 , rglob_worker 是外部函数 , 非类内函数 ,po = getPoolBojcet() 这一行是类内函数 ,红色箭头 2. 在的那条白色分割线 是2个函数。 )

10769157-79031c67687e882c.png
image.png

len(po._cache) == 1 : po._cache 是当前有任务的进程数, ==1表示所有任务结束;

利用回调 , 可以更轻松地进行进程通信。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值