Python中Celery在3.5之前版本执行zipfile时存在线程安全问题吗?

Python中Celery在3.5之前版本执行zipfile时存在线程安全问题吗?

17 回复

线程不安全? GIL 了解一下?难道你用的不是 cpython?


在Celery 3.5之前的版本中,确实存在一个已知的线程安全问题,主要与zipfile模块的使用相关。具体来说,问题出现在Celery的billiard依赖(用于处理进程池)中,当它尝试导入zipfile模块时,可能会在多线程环境下引发竞争条件。

问题根源

  • zipfile模块在Python标准库中使用了共享的类级缓存(_ZipDecrypter)。
  • 在Celery 3.5之前,billiard在初始化进程池时,会在子进程中导入zipfile模块。
  • 如果父进程的多个线程同时创建子进程,可能导致多个线程并发初始化zipfile,进而引发缓存竞争,最终可能导致RuntimeError或数据损坏。

解决方案

  1. 升级到Celery 3.5或更高版本:官方在该版本中修复了此问题,通过避免在子进程中导入zipfile来消除竞争条件。
  2. 如果无法升级:可以尝试在程序启动时(在任何线程创建之前)预先导入zipfile模块,例如在代码开头添加import zipfile。但这只是一种缓解措施,并非完全可靠。

代码示例(缓解措施)

import zipfile  # 在主线程中预先导入
from celery import Celery

app = Celery('myapp')

# 其他配置和任务定义...

总结建议:直接升级Celery到3.5以上版本是最稳妥的解决方案。

GIL 并不保证 python 所有操作就是线程安全的…

用 async/await 保证线程安全

仔细看了一下,你说得对。谢谢

python3.5 是做了什么吗?好像找不到相关资料?

python 这种不能用多核的渣渣 压缩不想办法 fork 到其他进程里干 你想卡死当前进程么

再说了 python 性能这么烂 需要经常压缩的话直接 shell 执行是性能最好的, 条件允许能不用 native 代码去压缩就不要用 python 去压文件

#5 我也没找到, 不知道楼主为什么这么说…

是有多烂,是准备写航空母舰吗

Python 当然能用多核,开多进程就可以了,GIL 只是说一个进程内开多线程不能用多核

zipfile 不是很了解,但是你的 celery 不是默认多进程吗?有什么问题,将异常信息写上来。标题一句话,内容全靠猜?

celery 有多个模式, prefork (default), eventlet, gevent or solo. 在默认 prefork 模式下开 worker 是多进程,资源都不共享,不存在线程安全问题吧?











参考大家的建议,本地也测试过,情况是这样的:
本地开发环境,单线程直接启动 celery 运行 zipfile 正常;生产环境是多 worker,这个任务里还有个 for 循环,只运行了第一个 loop 就熄火了。(所以整个任务是没有执行完成的,现在先用 thread 扛着在用,线上 celery 的故障还没有找出来)



和航空母舰有毛线关系
压缩这频繁计算的频繁复制 buf 的
python 又不能用多核还跑到一个进程里
你这要么进程不干活了 要么压缩死慢


你不贴代码怎么帮你

谁懂你代码里做了啥影响了进程

大神你好,你们公司还招人吗?我想给你打杂

是不是开的线程太多,导致一次打开的文件 io 太多超过了系统的 net.core.somaxconn 的大小?

回到顶部