Ошибка cx_freeze «zlib not avaiable» при использовании нескольких потоков

У меня есть приложение Python, которое отлично работает при запуске через стандартный интерпретатор, ноне когда заморожен сcx_freeze.

Мое приложение использует PythonThreading модуль, и обычно имеет около 5 работающих компонентов, каждый из которых может быть индивидуально включен / отключен в своей конфигурации, и каждый работает в своем собственном отдельном потоке.

С 1 или 2 включенными компонентами проблем нет. Однако, когда включены 3 или более компонентов, я вижу следующее сообщение об ошибке для всех или почти всех моих потоков:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python\64-bit\3.3\lib\threading.py", line 637, in _bootstrap_inner
  File "<absolute path to my .py file on disk>", line 21, in run
    from module import screenshot
  File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1616, in _handle_fromlist
  File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 313, in _call_with_frames_removed
  File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1567, in _find_and_load
  File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1534, in _find_and_load_unlocked
  File "<absolute path to my .py file on disk>", line 1, in <module>
    from PIL import ImageGrab
  File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1567, in _find_and_load
  File "C:\Python\64-bit\3.3\lib\importlib\_bootstrap.py", line 1534, in _find_and_load_unlocked
zipimport.ZipImportError: can't decompress data; zlib not available

Несколько вещей, на которые стоит обратить внимание:

Python этоне установлен вC:\Python\64-bit\3.3, поэтому я не уверен, почему этот путь появляется в выводе выше. Он установлен по умолчанию вC:\Python33, (Не уверен, является ли путь, показанный выше, фиктивным, или, возможно, путь человека, который составил одну из моих зависимостей.)Повторюсь - это начинает происходить постоянно, когда я запускаю более 2 потоков или около того. Этоникогда случается только с 1 активным потоком, и я никогда не видел, чтобы это случилось с 2 активными потоками.Эта проблематолько случается когдаcx_freeze используется. Запуск его с интерпретатором Python не вызывает ошибок. Я пробовал несколько разныхsetup.py директивы (например,appendScriptToLibrary, appendScriptToExe, copyDependentFiles, create_shared_zip), но вопрос всегда один и тот же.Мой код не использует функции zip - так что это должно быть что-то особенное для процесса замораживания.

Мои мысли до сих пор:

Я думаю, что есть некоторая проблема с потоком, пытающимся получить доступ кzlib или жеzipimport модули, когда их использует другой поток (то есть блокирует их). (Интересно, что этого не происходит для двух потоков.) Мой Google заставил меня провести некоторое исследование GIL - может ли это быть проблемой здесь? Или есть ли способ разрешить потокам захватывать только общую блокировку файла вместо эксклюзивной блокировки?Быть относительным новичком сcx_freezeЯ пробовал несколько разных способов, включаяzlib модуль вsetup.py, Тем не менее, я не думаю, что это проблема сzlib в частности, так как он работает за пределамиcx_freeze.

Окружающая обстановка:

Windows 7 64-битнаяPython 3.3 64-битныйcx_freeze 4.3.2

Видетьhttp://www.filedropper.com/threadtest для воспроизведения этого вопроса с минимальным кодом.

Ответы на вопрос(0)

Ваш ответ на вопрос