2012-02-08 37 views
3

djangoプロジェクトでは、dbのオブジェクト用のpdfファイルをいくつか生成する必要があります。各ファイルは生成に数秒かかるので、私はセロリを使ってタスクを非同期で実行します。python zipファイルはスレッドセーフですか?

問題は、各ファイルをzipアーカイブに追加する必要があることです。私はpython zipfileモジュールを使用する予定でしたが、別のスレッドで異なるタスクを実行することができます。同時に2つのタスクがファイルをアーカイブに追加しようとするとどうなるでしょうか?

次のコードスレッドは安全ですか?私は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

どのセロリー並行性メソッドを使用しますか?コードがデフォルトのマルチプロセッシング同時実行方式を使用してセロリのタスクで実行される場合、それらは別々のプロセスで実行されるため、スレッドの安全性について心配する必要はありません。 – mher

+0

問題はスレッドセーフではなく、同時にファイルへの書き込みアクセスです。 –

答えて

2

を実行しているいいえ、それはその意味ではスレッドセーフではありません。 同じzipファイルに追加している場合は、そこにロックが必要です。そうしないと、ファイルの内容が乱れる可能性があります。 異なるZIPファイルに別のZipFile()オブジェクトを追加している場合は、問題ありません。

0

この質問は古いですが、Googleの検索結果ではまだ高いですから、私はpython 3.4に気付いたと言います。64bit Windowsで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

関連する問題