当python代码被cx\U冻结时,QThread在解码UTF-16时阻塞?

当python代码被cx\U冻结时,QThread在解码UTF-16时阻塞?,python,multithreading,qt,pyside,cx-freeze,Python,Multithreading,Qt,Pyside,Cx Freeze,事实上,这个问题是大型系统中的一个严重缺陷,我们将问题简化为下面的代码片段。我们想弄清楚为什么python代码和exe文件中的线程行为不同 该代码包含两个线程,我们希望这两个线程可以同时运行,并在使用python 2.7的Windows 7(64位)中终止 当我直接使用CPython时,比如说,在控制台中使用“pythonthread.py”,代码运行正常。这两条线都正常运行和结束 但是,当代码被冻结为exe并执行时,子线程阻塞在行uu=u16.decode(“utf-16”)中,而主线程进入死

事实上,这个问题是大型系统中的一个严重缺陷,我们将问题简化为下面的代码片段。我们想弄清楚为什么python代码和exe文件中的线程行为不同

该代码包含两个线程,我们希望这两个线程可以同时运行,并在使用python 2.7的Windows 7(64位)中终止

当我直接使用CPython时,比如说,在控制台中使用“pythonthread.py”,代码运行正常。这两条线都正常运行和结束

但是,当代码被冻结为exe并执行时,子线程阻塞在行uu=u16.decode(“utf-16”)中,而主线程进入死循环

下面是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()
我们怀疑cx_Freeze中存在bug,这导致了原始代码和exe之间的不同行为。 请帮助我们找到解决方案,使线程通过解码代码,谢谢


经过几天艰难的调试,我们在$Python27$\Lib\encodings\\uuuu init\uuuu.py中找到了这一行中的线程块

    mod = __import__('encodings.' + modname, fromlist=_import_tail,level=0)
cx_Freeze在多线程中导入运行时模块时存在错误


最后,我们使用hack代码绕过阻塞代码,例如,在线程代码之外手动导入模块。然而,我们不认为这是一个优雅的解决方案,因为仍然存在隐藏的导入错误,这可能会在将来发生。
希望cx_Freeze的作者能够修复该漏洞,并为我们的问题提供完美的解决方案。

cx_Freeze的作者已经解决了该漏洞,并将其更新为5.0.2


相关问题是

cx_Freeze的作者已经解决了该漏洞,并将其更新为5.0.2

相关问题是

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