PyQt 5とPythonのマルチスレッド
概要
Pythonプログラム自体には真の意味の同時マルチスレッドはなく,GILロックに制約されている.真のマルチスレッドを実現するには、マルチプロセスによって実現する必要があり、クラスUnixプラットフォームは
マルチプロセスはリソースを消費します.場合によっては、高I/O、軽量計算などのマルチプロセスを使用する必要がある軽量レベルのタスクもあります.
コードインスタンス
次に、メインループで呼び出します.
これにより、
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
のデッドサイクルはイベントサイクルメカニズムに永遠に入れないため、処理できない!!!