使用Qt进行多处理适用于Windows,但不适用于Linux

Nor*_*ern 7 python linux pyqt python-multiprocessing

我正在使用Qt开发GUI应用程序.

当我尝试QApplication使用multiprocessing以下方法创建另一个时出错:

RuntimeError:QApplication实例已存在

我有一个主窗口,其中包含一个用于生成新进程的按钮,以便我可以创建一个新的GUI实例.基本上是这样的:

from PySide.QtCore import *
from PySide.QtGui import *
import multiprocessing
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        btn = QPushButton('run new instance')
        btn.clicked.connect(self.create_daemon)
        self.setCentralWidget(btn)

    def create_daemon(self):
        p = multiprocessing.Process(target=new_window)
        p.start()

def new_window():
    app=QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

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

它适用于Windows但RuntimeError在Linux中提供.这是因为Windows和Linux之间的多处理机制存在差异吗?我怎么能在Linux中实现同样的东西?

Nor*_*ern 7

经过一些谷歌搜索python多处理后,我想通了.

关键是,取决于平台multiprocessing支持不同的方式来启动新进程.有一个很好的解释在这里.因此,会发生的情况是多处理spawn在Windows中用作默认方法,而fork在Linux中则用作默认方法.区别:

产卵:

父进程启动一个新的python解释器进程.子进程只会继承运行进程对象run()方法所需的那些资源.特别是,不会继承父进程中不必要的文件描述符和句柄.

叉子:

父进程用于os.fork()分叉Python解释器.子进程在开始时实际上与父进程相同.父进程的所有资源都由子进程继承.

因此,我找到了一个简单的解决方案:

加上multiprocessing.set_start_method('spawn')贝娄if __name__=="__main__":.

set_start_method()是3.4版本中的新功能.很高兴有这个更新!我不知道如何在以前的版本中设置此参数.有谁知道?