2012-02-08 4 views
3

В проекте django мне нужно сгенерировать некоторые файлы PDF для объектов в db. Поскольку для создания каждого файла требуется несколько секунд, я использую сельдерей для асинхронного запуска задач.Является ли python zipfile потокобезопасным?

Проблема в том, что мне нужно добавить каждый файл в zip-архив. Я планировал использовать zipfile-модуль python, но разные задачи можно запускать в разных потоках, и мне интересно, что произойдет, если две задачи попытаются добавить файл в архив одновременно.

Является ли следующий код безопасным или нет? Я не могу найти какую-либо ценную информацию в официальном документе 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

+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.

В моем случае я получаю около 80-90% использования процессора на 8 ядрах и SSD, что приятно.

+0

любая ссылка на ZIP_LZMA, являющаяся потокобезопасной? – denfromufa

Смежные вопросы