python zipfile是线程安全的吗?

python zipfile是线程安全的吗?,python,thread-safety,zipfile,Python,Thread Safety,Zipfile,在django项目中,我需要为db中的对象生成一些pdf文件。由于生成每个文件需要几秒钟,所以我使用芹菜异步运行任务 问题是,我需要将每个文件添加到zip存档中。我本来打算使用python zipfile模块,但是不同的任务可以在不同的线程中运行,我想知道如果两个任务同时尝试向存档添加一个文件,会发生什么情况 以下代码是否是线程安全的?我在python的官方文档中找不到任何有价值的信息 try: zippath = os.path.join(pdf_directory, 'archive

在django项目中,我需要为db中的对象生成一些pdf文件。由于生成每个文件需要几秒钟,所以我使用芹菜异步运行任务

问题是,我需要将每个文件添加到zip存档中。我本来打算使用python zipfile模块,但是不同的任务可以在不同的线程中运行,我想知道如果两个任务同时尝试向存档添加一个文件,会发生什么情况

以下代码是否是线程安全的?我在python的官方文档中找不到任何有价值的信息

try:
    zippath = os.path.join(pdf_directory, 'archive.zip')
    zipfile = ZipFile(zippath, 'a')
    zipfile.write(pdf_fullname)
finally:
    zipfile.close()

注意:这是在Python2.6下运行的。不,从这个意义上讲,它不是线程安全的。 如果要附加到同一个zip文件,则需要在那里设置锁,否则文件内容可能会混乱。
如果您使用单独的
ZipFile()
对象附加到不同的zip文件,那么您就没事了。

虽然这个问题很老了,但它在google搜索结果中仍然很重要,所以我只想插话说,我注意到在windows上的python 3.4 64位上,lzma ZipFile是线程安全的;其他的都失败了

with zipfile.ZipFile("test.zip", "w", zipfile.ZIP_LZMA) as zip:
    #do stuff in threads
请注意,不能将同一个文件与多个zipfile.zipfile实例绑定,而是必须在所有线程中使用同一个实例;这里是名为zip的变量


在我的例子中,我在8核和SSD上使用了大约80-90%的CPU,这很好。

Python 3.5.5使写入ZipFile和读取多个ZipExt文件成为线程安全的:

据我所知,这个变化还没有被后传到Python2.7


更新:在研究代码和一些测试之后,很明显,锁定仍然没有完全实现。它仅适用于
writestr
,不适用于
open
write

您使用哪种芹菜并发方法?如果您的代码在芹菜任务中使用默认的多处理并发方法执行,那么它们将在单独的进程中执行,您不必担心线程安全。那么,问题不在于线程安全,而在于同步文件写入访问。请在中查找
bpo-14099
changelog@AndreHolzner是的,这就是我的意思。我对不完全支持的评论仍然正确,至少对3.5.5来说是这样。