2012-02-08 135 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