Python:PyQt 应用程序中的多进程处理

3

我电脑上有一颗i7处理器,为了提高我的pyqt应用程序的时间计算性能,我尝试使用multiprocessing模块;当我在pyqt应用程序中执行以下操作:

import multiprocessing as multiprocessing

def foo(ii):
    print ii

pool = multiprocessing.Pool(8)
pool.map(foo, range(10))

然后该应用程序生成了8个pyqt GUI,它们是第一个主窗口的克隆(总共有9个pyqt GUI,这当然是错误的,我想要做的是并行计算而不是克隆主GUI xD)。

我也尝试过joblib库(http://pythonhosted.org/joblib/),但问题仍然存在。

是否有一种方法可以在使用多进程或joblib模块的pyqt应用程序中进行并行计算?

感谢任何帮助。


2
你在使用Windows吗?如果是的话,你是否使用if __name__ == '__main__'保护来生成UI?无论如何,我认为你想要的是无法实现的,因为fork会复制所有线程,包括UI线程(从而生成更多的UI)。你应该将并行计算放在“外部”进程中,并从UI中调用它。 - Bakuriu
是的,我在Windows上,我不知道关于if name == 'main'保护生成UI xD,因为我是新手Python xD。好的,我将尝试使用外部进程进行计算,谢谢 :) - opensw
3个回答

4

如果您使用的是Windows操作系统,多进程会启动新的进程并导入您的主模块。请确保将GUI创建代码放置在if __name__ == '__main__':之下以防止意外运行。

更好的方式是为了避免在子进程中无谓地导入PyQt而创建一个简单的新主模块,如下所示:

if __name__ == '__main__':
    import old_main_module
    old_main_module.main()

1

在遇到“多进程池中有多个GUI”的问题后,我来到了这里。过了一段时间,我找到了解决方案这里这里

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

    a = QApplication(sys.argv)
    ...

1
你想要为pyqt生成多个进程,还是想要为你的应用程序的“逻辑”添加额外的进程?
更重要的是:不要将pyqt容器进行多进程处理——如果你想要并行处理,请在应用程序逻辑上生成进程,并将结果返回到视图层。

你是像@Bakuriu一样建议我使用外部进程进行计算并从主GUI调用它们吗?谢谢 :) - opensw
1
可以这样做,没错。if __name__ == '__main__'技巧基本上是说“如果你直接调用这个文件(而不是从一个模块中),运行以下代码。”通常会有一个名为main.py的文件来运行GUI,让导入完成你的脏活。你不一定要将代码分成多个文件,只需将代码分开,以便在不调用pyqt的情况下调用计算函数即可。 - user559633

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接