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中实现同样的东西?
经过一些谷歌搜索python多处理后,我想通了.
关键是,取决于平台multiprocessing支持不同的方式来启动新进程.有一个很好的解释在这里.因此,会发生的情况是多处理spawn在Windows中用作默认方法,而fork在Linux中则用作默认方法.区别:
产卵:
父进程启动一个新的python解释器进程.子进程只会继承运行进程对象
run()方法所需的那些资源.特别是,不会继承父进程中不必要的文件描述符和句柄.
叉子:
父进程用于
os.fork()分叉Python解释器.子进程在开始时实际上与父进程相同.父进程的所有资源都由子进程继承.
因此,我找到了一个简单的解决方案:
加上multiprocessing.set_start_method('spawn')贝娄if __name__=="__main__":.
set_start_method()是3.4版本中的新功能.很高兴有这个更新!我不知道如何在以前的版本中设置此参数.有谁知道?
| 归档时间: |
|
| 查看次数: |
972 次 |
| 最近记录: |