Error de cx_freeze “zlib no disponible” cuando se utilizan varios subprocesos

Tengo una aplicación Python que funciona perfectamente cuando se ejecuta a través del intérprete estándar, pero no cuando se congela con cx_freeze .

Mi aplicación utiliza el módulo de Threading python, y generalmente tiene alrededor de 5 componentes en ejecución, cada uno de los cuales puede habilitarse / deshabilitarse individualmente en su configuración, y cada uno se ejecuta en su propio subproceso individual.

Con 1 o 2 componentes habilitados, no hay problema. Sin embargo, cuando hay 3 o más componentes habilitados, veo el siguiente mensaje de error para todos o casi todos mis hilos:

 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 "", 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 "", line 1, in  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 

Algunas cosas a tener en cuenta:

  • Python no está instalado en C:\Python\64-bit\3.3 , por lo que no estoy seguro de por qué esta ruta aparece en la salida anterior. Se instala en su ubicación predeterminada de C:\Python33 . (No estoy seguro de si el camino que se muestra arriba es uno ficticio, o quizás el camino de la persona que compiló una de mis dependencias).
  • Para reiterar: esto comienza a ocurrir constantemente cuando inicio más de 2 subprocesos o menos. Nunca sucede con solo 1 hilo activo, y nunca lo he visto con 2 hilos activos.
  • Este problema solo ocurre cuando se usa cx_freeze . Ejecutarlo con el intérprete de Python no produce errores. He probado varias directivas setup.py diferentes (por ejemplo, appendScriptToExe , copyDependentFiles , create_shared_zip , create_shared_zip ), pero el problema es siempre el mismo.
  • Mi código no hace uso de las funciones zip, por lo que esto debe ser algo específico del proceso de congelación.

Mis pensamientos hasta ahora:

  • Creo que hay un problema con un hilo que intenta acceder a los módulos zlib o zipimport cuando otro hilo los está utilizando (es decir, tiene un candado). (Sin embargo, es interesante que esto no suceda con 2 hilos). Mi búsqueda en Google me ha llevado a investigar un poco sobre la GIL. ¿Podría ser un problema aquí? O, ¿hay alguna manera de permitir que los hilos solo tomen un locking compartido en un archivo en lugar de un locking exclusivo?
  • Siendo un novato relativo con cx_freeze , he probado algunos métodos diferentes para incluir el módulo zlib en setup.py . Sin embargo, no creo que este sea un problema con zlib específicamente, ya que funciona bien fuera de cx_freeze .

Ambiente:

  • Windows 7 de 64 bits
  • Python 3.3 de 64 bits
  • cx_freeze 4.3.2

Visite http://www.filedropper.com/threadtest para ver una reproducción de este problema con un código mínimo.