Python 使用moveToThread在PyQt5中启动QThreads。一个线程无法正常启动

Python 使用moveToThread在PyQt5中启动QThreads。一个线程无法正常启动,python,multithreading,pyqt,qthread,pyqt5,Python,Multithreading,Pyqt,Qthread,Pyqt5,在下面的(半)工作示例中,我有4个工作线程。我只能使前三个辅助线程工作。如何运行第四个线程 print(QThread.idealThreadCount())在我的笔记本电脑上返回“8” 我可以对代码进行重新排序,以使3个worker的任意组合都能运行 from PyQt5.QtCore import QThread, QObject from PyQt5.QtWidgets import QWidget import sys from PyQt5.QtWidgets import QAppli

在下面的(半)工作示例中,我有4个工作线程。我只能使前三个辅助线程工作。如何运行第四个线程

print(QThread.idealThreadCount())
在我的笔记本电脑上返回“8”

我可以对代码进行重新排序,以使3个worker的任意组合都能运行

from PyQt5.QtCore import QThread, QObject
from PyQt5.QtWidgets import QWidget
import sys
from PyQt5.QtWidgets import QApplication
import time

class A(QObject):
    def run(self):
        while 1:
            print('A', time.ctime())
            time.sleep(1)
class B(QObject):
    def run(self):
        while 1:
            print('B', time.ctime())
            time.sleep(1)
class C(QObject):
    def run(self):
        while 1:
            print('C', time.ctime())
            time.sleep(1)
class D(QObject):
    def run(self):
        while 1:
            print('D', time.ctime())
            time.sleep(1)

class window1(QWidget):
    def __init__ (self, parent = None):
        super().__init__ () #parent widget
        print(QThread.idealThreadCount())

        self.thread1 = QThread()
        obj1 = A()
        obj1.moveToThread(self.thread1)
        self.thread1.started.connect(obj1.run)
        self.thread1.start()

        self.thread2 = QThread()
        obj2 = B()
        obj2.moveToThread(self.thread2)
        self.thread2.started.connect(obj2.run) 
        self.thread2.start()

        self.thread3 = QThread()
        obj3 = C()
        obj3.moveToThread(self.thread3)
        self.thread3.started.connect(obj3.run)
        self.thread3.start()

        self.thread4 = QThread()
        obj4 = D()
        obj4.moveToThread(self.thread4)
        self.thread4.started.connect(obj4.run)
        self.thread4.start()

app = QApplication(sys.argv) 
w = window1()
w.show()
sys.exit(app.exec_())

我发现如果我在
\uuuu init\uuuu
方法的垂直端添加
time.sleep(1)
延迟,那么所有线程现在都可以工作了

不过,我想了解原因。如果有更好的答案,我们将不胜感激

from PyQt5.QtCore import QThread, QObject
from PyQt5.QtWidgets import QWidget, QApplication
import sys
import time

class A(QObject):
    def run(self):
        while 1:
            print('A', time.ctime())
            time.sleep(1)
class B(QObject):
    def run(self):
        while 1:
            print('B', time.ctime())
            time.sleep(1)
class C(QObject):
    def run(self):
        while 1:
            print('C', time.ctime())
            time.sleep(1)
class D(QObject):
    def run(self):
        while 1:
            print('D', time.ctime())
            time.sleep(1)

class window1(QWidget):
    def __init__ (self, parent = None):
        super().__init__ () #parent widget

        self.thread1 = QThread()
        obj1 = A()
        obj1.moveToThread(self.thread1)
        self.thread1.started.connect(obj1.run)
        self.thread1.start()

        self.thread2 = QThread()
        obj2 = B()
        obj2.moveToThread(self.thread2)
        self.thread2.started.connect(obj2.run) #this sets up a signal in the other direction??
        self.thread2.start()

        self.thread3 = QThread()
        obj3 = C()
        obj3.moveToThread(self.thread3)
        self.thread3.started.connect(obj3.run) #this sets up a signal in the other direction??
        self.thread3.start()

        self.thread4 = QThread()
        obj4 = D()
        obj4.moveToThread(self.thread4)
        self.thread4.started.connect(obj4.run)
        self.thread4.start()

        time.sleep(1)

app = QApplication(sys.argv) #every pyqt application must create an application object
w = window1()
w.show()
sys.exit(app.exec_())

您没有存储对
obj1
obj2
等的引用。因为它们没有父对象(使用
moveToThread
需要父对象),所以它们在
\uuu init\uuuu
方法末尾被垃圾收集。您添加的
time.sleep(1)
只会延迟
\uuuu init\uuu
方法和垃圾收集的结束


如果存储对对象的引用(例如
self.obj1=…
),则所有线程都应正确运行。

但是如果我有许多线程,在将它们存储在诸如self之类的列表中之后。\u线程,我如何在它们完成后删除它们?@Shuman。这不是一个真正可以扩展的地方,答案可能取决于你的具体情况。