2012-02-08 125 views
3

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

问题是,我需要将每个文件添加到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

您使用哪种芹菜并发方法?如果你的代码在具有默认多处理并发方法的celery任务中执行,那么它们在不同的进程中执行,你不必担心线程的安全性。 – mher 2012-02-09 10:24:52

+0

然后,问题不是线程安全,而是同时文件写入访问。 – 2012-02-09 10:26:29

回答

2

不,它不是线程安全的,在这个意义上运行。 如果您追加到相同的zip文件,您需要在那里锁定,否则文件内容可能会混乱。 如果您追加到不同的zip文件,使用单独的ZipFile()对象,那么你很好。

0

虽然这个问题很老,但它仍然在谷歌搜索结果上,所以我只是想说,我注意到在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使用率,这很好。

+0

对ZIP_LZMA是否是线程安全的任何引用? – denfromufa 2018-01-05 21:33:10