Python 具有巨大时延差的线程按顺序运行

Python 具有巨大时延差的线程按顺序运行,python,pyqt5,python-multithreading,Python,Pyqt5,Python Multithreading,我目前正在寻找一种方法,将TCP/IP通信添加到用pyQt编写的应用程序中。虽然我测试的代码似乎都不起作用(在大多数情况下,它只是冻结了GUI),但我开始研究线程 在堆栈上找到一些代码,并添加了睡眠延迟。我已经阅读了一些关于线程按顺序运行的信息,我想我了解了一些线程是如何工作的,但是我得到的结果并不是我所期望的 导入系统 从PyQt5导入QtWidgets、QtCore、QtGui 导入时间 导入线程 类示例(qtwidts.QWidget): 定义初始化(自): super(例如,self)。

我目前正在寻找一种方法,将TCP/IP通信添加到用pyQt编写的应用程序中。虽然我测试的代码似乎都不起作用(在大多数情况下,它只是冻结了GUI),但我开始研究线程

在堆栈上找到一些代码,并添加了睡眠延迟。我已经阅读了一些关于线程按顺序运行的信息,我想我了解了一些线程是如何工作的,但是我得到的结果并不是我所期望的

导入系统 从PyQt5导入QtWidgets、QtCore、QtGui 导入时间 导入线程 类示例(qtwidts.QWidget): 定义初始化(自): super(例如,self)。\uuuuu init\uuuuuuuu() qtwidts.QToolTip.setFont(QtGui.QFont('SansSerif',10)) btn=QtWidgets.QPushButton('Button',self) self.show() self.background=MyThread(self) t=threading.Thread(target=self.background.process) t2=线程.Thread(目标=self.background.process2) t、 开始() t2.start() self.background.notify.connect(self.notify) self.background.notify2.connect(self.notify2) @QtCore.pyqtSlot() def通知(自我): 打印(“已通知我”) @QtCore.pyqtSlot() def notify2(自我): 打印(“我已收到两份通知”) 类MyThread(QtCore.QObject): notify=QtCore.pyqtSignal() notify2=QtCore.pyqtSignal() 定义初始化(自身,父级): 超级(MyThread,self)。\uuuuu init\uuuuuuuu(父级) self.should_continue=True def过程(自我): 当self.u继续时: #这里,做你的服务器工作。 睡眠时间(0.001) self.notify.emit() def进程2(自): 当self.u继续时: #这里,做你的服务器工作。 睡眠时间(0.1) self.notify2.emit() def main(): app=qtwidts.QApplication(sys.argv) ex=示例() sys.exit(app.exec_()) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': main() 为什么我会得到:

I have been notified
I have been notified two
I have been notified two
I have been notified
I have been notified
I have been notified two
I have been notified
I have been notified two
而不是像

I have been notified
I have been notified two
I have been notified
I have been notified
I have been notified
I have been notified
I have been notified

notify与notify2打印数的比率不应该等于时间延迟比率吗?

您将错误的方法连接到了错误的信号
process2
发出
notify2
,而不是
notify
,因此您必须更改:

self.background.notify.connect(self.notify)
self.background.notify.connect(self.notify2)

self.background.notify.connect(self.notify)
self.background.notify2.connect(self.notify2)

而且它会正常工作。

有相关文档。另一件奇怪的事情是,
self.background.notify2
在您共享的代码中没有连接,那么notify2 pyQtSlot是如何被调用的呢?只是为了避免您将来的痛苦:您希望对Qt内容使用
QThreads
而不是普通的
threading.Thread
s。另外,在信号方面也有一些古怪的事情。另外:根据我的经验,QtGUI元素不是线程安全的,因此您希望在每次交互中使用信号。键入:将
self.background.notify.connect(self.notify2)
更改为
self.background.notify2.connect(self.notify2)
它的工作原理不同,但notify与notify2打印的时间延迟比率并不相等,不是吗?我已经将计时器更改为1s/5s(对于第二种方法),以减少输出并获得更清晰的概念,如果是这样的话,那是打印方法执行时间问题吗?如果遇到问题,可能与使用Python的本机
线程
而不是
QThread
有关。从我(和其他评论者)的经验来看,它有时会得到奇怪的结果,特别是像你这样的小周期。