PyQt 5とPythonのマルチスレッド


概要
Pythonプログラム自体には真の意味の同時マルチスレッドはなく,GILロックに制約されている.真のマルチスレッドを実現するには、マルチプロセスによって実現する必要があり、クラスUnixプラットフォームはforkシステム呼び出しを提供していますが、Windowsプラットフォームではマルチプロセスを実現することは難しいです.
マルチプロセスはリソースを消費します.場合によっては、高I/O、軽量計算などのマルチプロセスを使用する必要がある軽量レベルのタスクもあります.threadingライブラリはPythonパッケージの高度なスレッドライブラリです.しかし、PyQt 5のUIを使用する場合、内部に信号とスロット機構があるため、QThreadのサブスレッドを使用することをより推奨する.
from PyQt5.QtCore import QThread


class MyThread(QThread):
	def __init__(self):
		super(MyThread, self).__init__()
	
	def run(self):
		"""
		           
		"""
		pass

コードインスタンス
import time

from PyQt5.QtCore import *
from PyQt5.QtWidgets import QApplication


class MyThread(QThread):
    sig = pyqtSignal(int)

    def __init__(self, parent=None):
        super(MyThread, self).__init__(parent)

    def run(self):
        n = 0
        while True:
            self.sig.emit(n)
            print("run")
            time.sleep(0.3)
            n += 1


class Main(QObject):
    def __init__(self, parent=None):
        super(Main, self).__init__(parent)

        self._thread = MyThread()
        self._thread.sig.connect(self.outText)
        self._thread.start()

    def outText(self, n):
        print(n)


#     Qt         
app = QApplication([])
main = Main()
app.exec_()
MyClassにデッドループ、すなわちクラスに関数を追加する誤った書き方がありました.
def work(self):
	while True:
		time.sleep(0.1)
		print("work")

次に、メインループで呼び出します.
main = Main()
main.work()

これにより、outText関数が呼び出されないことがわかります.信号処理はQt自身の信号サイクルで処理されるため、workのデッドサイクルはイベントサイクルメカニズムに永遠に入れないため、処理できない!!!