在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
下运行的答案 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
,不适用于write
和overflow-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使用率,这很不错。