【问题标题】:Python: multiprocessing in pyqt applicationPython:pyqt 应用程序中的多处理
【发布时间】:2013-03-09 09:28:09
【问题描述】:

我的计算机中有一个 i7 CPU,为了提高我的 pyqt 应用程序的时间计算性能,我正在尝试使用多处理模块;当我在 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/) 但问题是一样的。

有没有办法在 pyqt 应用程序中使用 multiprocessing 或 joblib 模块进行并行计算?

感谢您的帮助

【问题讨论】:

  • 你在windows上吗?如果是这样,您是否使用 if __name__ == '__main__' 防护来生成 UI?无论如何,我相信您想要的无法实现,因为fork 复制了所有线程,也复制了 UI 线程(从而产生了更多的 UI)。您可能应该将并行计算放在“外部”进程中并从 UI 调用它。
  • 是的,我在 Windows 上,我对 if name == 'main' 守卫生成 UI xD 一无所知,因为我是 python xD 的新手。好的,我将尝试使用外部进程进行计算,谢谢 :)

标签: python user-interface pyqt multiprocessing


【解决方案1】:

如果您在 Windows 上,多处理将启动导入主模块的新进程。确保将 GUI 创建代码放在if __name__ == '__main__': 下,以保护它

更好的是,为了避免在子进程中不必要地导入 PyQt 的开销,创建一个简单的新主模块,如下所示:

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

【讨论】:

    【解决方案2】:

    您想为 pyqt 生成多个进程,还是想为应用程序的“逻辑”添加额外的进程?

    更重要的是:不要多处理 pyqt 容器 - 如果您想要并行性,请在应用程序的逻辑上生成进程并将结果返回到您的视图层。

    【讨论】:

    • 像@Bakuriu 一样,您是否建议我使用外部进程进行计算并从主 GUI 调用它们?谢谢 :)
    • 你可以这样做,是的。 if __name__ == '__main__' 技巧基本上是说“如果您直接调用此文件(而不是从模块中),请运行以下代码。”有某种 main.py 来运行你的 GUI 是很常见的,而让导入来做你的脏活。您没有必须将您的代码分成多个文件 - 只需将您的代码分开,这样您就可以在不调用 pyqt 的情况下调用您的计算函数。
    【解决方案3】:

    在遇到“multioprocessing.Pool() 上的多个 GUI”问题后,我来到这里。 过了一会儿我找到了解决方案here分别here

    from multiprocessing import freeze_support
    
    if __name__ == '__main__':
        freeze_support()
    
        a = QApplication(sys.argv)
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 2018-03-25
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多