python zipfile是线程安全的吗?

时间:2012-02-08 14:26:19

标签: python django thread-safety celery zipfile

在django项目中,我需要为db中的对象生成一些pdf文件。由于每个文件都需要几秒钟才能生成,因此我使用celery异步运行任务。

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

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

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

注意:这是在python 2.6

下运行的

3 个答案:

答案 0 :(得分:5)

不,在这个意义上它不是线程安全的。 如果您要附加到同一个zip文件,那么您需要锁定,否则文件内容可能会被扰乱。 如果您使用单独的ZipFile()对象附加到不同的zip文件,那么您没问题。

答案 1 :(得分:1)

Python 3.5.5使写入ZipFile并读取多个ZipExtFiles线程安全:https://docs.python.org/3.5/whatsnew/changelog.html#id93

据我所知,此更改尚未向后移植到Python 2.7。

更新:在研究了代码和一些测试之后,很明显锁定仍未完全实现。它只适用于open,不适用于writeoverflow-scroll="true"

答案 2 :(得分:0)

虽然这个问题很老,但谷歌搜索结果仍然很高,所以我只想说我注意到在Windows上的python 3.4 64bit上,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使用率,这很不错。