PyQt 信号中的保证和使用队列的比较

Guarantees in PyQt Signals and comparistion to use a Queue

我正在考虑两种机制来在应用程序的不同线程之间传递结果。一种可能性是创建一个 Python 或 PyQt 队列,该队列由一个线程填充并由该线程使用。但我也可以使用 PyQt Signal/Slots 来达到同样的目的。后者的优点是我可以拥有多个消费者而无需任何额外工作,但我想知道是否有缺点。特别是

  1. 信号是否保证会中继到连接的插槽,或者可能会被错过?
  2. 是否保证信号的接收顺序与其发出的顺序相同?

1.信号是否保证会中继到连接的插槽,或者它们可能会被错过?

Qt保证slot接收到信息。在 Qt 的后台,信号位于由事件循环处理的队列中,这是一个优势,因为队列可以访问连接。

2。是否保证信号的接收顺序与发出的顺序相同?

作为我之前回答中的信号,Qt 将要传输的信息保存在一个队列中。您还必须知道只有在同步任务结束或某个辅助线程处于休眠状态时才会调用槽。然后检查订单是否得到遵守,我们可以使用以下示例,其中发出 5 次信号发射,并且在睡眠中调用插槽。

from PyQt5 import QtCore


class FooObject(QtCore.QObject):
    foosignal = QtCore.pyqtSignal(int)

    @QtCore.pyqtSlot()
    def run(self):
        counter = 0
        for _ in range(10):
            for i in range(5):
                self.foosignal.emit(counter)
                counter += 1
            QtCore.QThread.sleep(1)


if __name__ == "__main__":
    import sys

    app = QtCore.QCoreApplication(sys.argv)
    foo = FooObject()
    thread = QtCore.QThread()
    thread.start()
    foo.moveToThread(thread)
    foo.foosignal.connect(print)
    QtCore.QTimer.singleShot(1000, foo.run)
    sys.exit(app.exec_())