2017-05-16 2 views
1

En fait, le problème est un bug sérieux dans un énorme système, et nous simplifions le problème dans l'extrait de code ci-dessous. Nous voulons comprendre pourquoi les comportements de thread sont différents dans le code python et le fichier exe.QThread bloque le décodage UTF-16 lorsque le code python est figé par cx_Freeze?

Le code comprend deux threads, et nous nous attendons à ce que les deux threads puissent fonctionner simultanément et se terminer dans Windows 7 (64 bits) avec python 2.7.

Le code s'exécute correctement lorsque j'utilise directement CPython, disons, en utilisant "python tThread.py" dans la console. Les deux fils fonctionnent et finissent normalement.

Cependant, lorsque le code est congelé en exe avec cx_Freeze 5.0.1 et exécuté, les blocs de sous-fil dans la ligne uu = u16.decode (« utf-16 »), tandis que le fil conducteur passe en morts boucle.

est Ci-dessous tThread.py:

# -*- coding: UTF-8 -*- 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

import time 
from PySide import QtGui, QtCore 
from PySide.QtCore import * 
from PySide.QtGui import * 

class Worker(QObject): 
    done = QtCore.Signal() 
    def longRun(self): 
     count = 1 
     while count < 20: 
      print "Worker Thread", count 
      u16 = u"ABCD".encode("utf-16") 
      uu = u16.decode("utf-16")  # Block here <--- 
      count += 1 
     self.done.emit() 


def mainThread(): 
    app = QApplication([]) 

    objThread = QThread() 
    obj = Worker() 
    obj.moveToThread(objThread) 
    obj.done.connect(objThread.quit) 
    objThread.started.connect(obj.longRun) 
    objThread.start() 


    i = 1 
    while not objThread.isFinished(): 
     QCoreApplication.processEvents() 
     print "Main Thread", i 
     time.sleep(0.1) 
     i+=1 

    print "Main Thread Over" 

mainThread() 
sys.exit() 

est inférieure à la setup.py fichier pour cx_Freeze:

(commande de la console est "python setup.py build_exe -b construire ")

from cx_Freeze import setup, Executable 
import platform 

build_exe_options = { 
    "packages": [ "PySide"], 
    "include_msvcr": True 
}; 

exe = Executable(u".\\tThread.py", base=None, targetName="tThread.exe") 

setup( name = "tThread", 
     version = "0.1", 
     description = u"tThread", 
     options = {"build_exe": build_exe_options}, 
     executables = [exe]) 

Nous suspectons qu'il y a s bug dans cx_Freeze, qui conduit aux différents comportements entre le code brut et exe. S'il vous plaît aidez-nous à trouver une solution pour faire passer le fil le code de décodage, merci.


Après le débogage difficile pendant plusieurs jours, on trouve les blocs de fil dans cette ligne encodages $ Python27 $ \ Lib \ \ __ init__.py

mod = __import__('encodings.' + modname, fromlist=_import_tail,level=0) 

cx_Freeze a un bug pour le module d'exécution -import en multi-threading. Enfin, nous contournons le code de blocage en utilisant le hack-code, par exemple, importons manuellement les modules en dehors du code de thread. Cependant, nous ne pensons pas que ce soit une solution élégante car il y a toujours un bug d'importation caché qui pourrait arriver dans le futur. Espère que l'auteur de cx_Freeze peut corriger le bug et fournir la solution parfaite à notre question.

Répondre

0

L'auteur de cx_Freeze a résolu le problème et l'a mis à jour en version 5.0.2.

Le problème associé est Here