/ / Is python zipfile thread-safe? - python, django, безопасност на конеца, целина, zipfile

Профилът на Python zipfile е безопасен? - python, django, безопасност на конеца, целина, zipfile

В проект django, аз трябва да генерира някои PDF файлове за обекти в DB. Тъй като всеки файл отнема няколко секунди, за да генерира, използвам целина, за да изпълнява задачи асинхронно.

Проблемът е, че трябва да добавя всеки файл към 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

Отговори:

4 за отговор № 1

Не, в този смисъл не е безопасно за нишката. Ако добавяте към един и същ пощенски файл, ще ви е необходима ключалка или съдържанието на файла може да се бърка. Ако добавяте към различни zip файлове, използвайте отделни ZipFile() обекти, тогава ти е добре.


0 за отговор № 2

Докато този въпрос е стар, той все още е висок на резултатите от Google, така че просто искам да звънна, за да кажа, че забелязах, че за Python 3.4 64bit на прозорците, 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 за отговор № 3

Python 3.5.5 прави писане на ZipFile и четене на множество ZipExtFiles threadsafe: https://docs.python.org/3.5/whatsnew/changelog.html#id93

Доколкото мога да кажа, промяната не е върната в Python 2.7.

Актуализация: след изучаването на кода и някои тестове, става ясно, че заключването все още не е напълно изпълнено. Той правилно работи само за writestr и не работи за open и write.