如何从PyQt正确执行多处理?

Rel*_*roC 5 python multiprocessing

我创建一个按钮,并在单击按钮时尝试运行多处理,

但是UI被阻止了.我希望进程能够在backgorund中运行.

我该如何解决?

from PySide2 import QtCore,QtGui,QtWidgets
import sys
import multiprocessing
from threading import Timer
class TTT(multiprocessing.Process):
    def __init__(self):
        super(TTT, self).__init__()
        self.daemon = True
    def run(self):
        while True:
            t = Timer(5, self.doSomething)
            t.start()
            t.join()

    def doSomething(self):
        try:
            print('123')
        except Exception as e:
            print(e)

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        btn = QtWidgets.QPushButton('run process')
        btn.clicked.connect(self.create_process)
        self.setCentralWidget(btn)

    def create_process(self):
        QtWidgets.QMessageBox.information(self,'hhh','hhh')
        t = TTT()
        t.start()
        t.join()

if __name__=="__main__":
    app=QtWidgets.QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

Eri*_*tný 6

Bendeg\xc3\xbaz Szatm\xc3\xa1ri 已经回答了主要问题。

\n\n

我只是想让您知道,在大多数使用情况下,使用 Process 并不是最好的主意。\n不同的进程不会与您的程序共享内存。你不能像控制不同的线程那样容易地控制它们。

\n\n

这是一个简单的示例,如何启动结束停止不同的线程。

\n\n
from PyQt5 import QtWidgets\nfrom PyQt5.QtCore import *\nimport sys\nimport time\n\n\nclass TTT(QThread):\n    def __init__(self):\n        super(TTT, self).__init__()\n        self.quit_flag = False\n\n    def run(self):\n        while True:\n            if not self.quit_flag:\n                self.doSomething()\n                time.sleep(1)\n            else:\n                break\n\n        self.quit()\n        self.wait()\n\n    def doSomething(self):\n        print(\'123\')\n\n\nclass MainWindow(QtWidgets.QMainWindow):\n    def __init__(self, parent=None):\n        super(MainWindow, self).__init__(parent)\n        self.btn = QtWidgets.QPushButton(\'run process\')\n        self.btn.clicked.connect(self.create_process)\n        self.setCentralWidget(self.btn)\n\n    def create_process(self):\n        if self.btn.text() == "run process":\n            print("Started")\n            self.btn.setText("stop process")\n            self.t = TTT()\n            self.t.start()\n        else:\n            self.t.quit_flag = True\n            print("Stop sent")\n            self.t.wait()\n            print("Stopped")\n            self.btn.setText("run process")\n\n\nif __name__=="__main__":\n    app=QtWidgets.QApplication(sys.argv)\n    ex = MainWindow()\n    ex.show()\n    sys.exit(app.exec_())\n
Run Code Online (Sandbox Code Playgroud)\n

  • 很好,非常感谢@Erik Šťastný!但我的原因是我有一个 CPU 密集型任务,所以我认为我应该使用多处理 (2认同)

小智 3

我从未使用过多重处理,但文档说join()方法会阻止调用者直到完成。将方法置于无限循环中将永远阻塞调用者(UI)。