【问题标题】:Python multiprocessing Pool start multiple GUIPython多处理池启动多个GUI
【发布时间】:2014-06-11 23:47:07
【问题描述】:

所有, 在我的 GUI 中,我使用多处理来运行一个函数。但池启动多个GUI。 我读过人们在他们的代码中添加if __name__ == '__main__': 并且它似乎有效。 但我不知道这个技巧是否适用于我的情况,以及我必须在哪里插入这段代码。 函数 run_func() 由 GUI 中的按钮启动。 我怎样才能阻止这个多次启动?

我还有第二个问题: 如何在执行结束时取消导入设置?

非常感谢!

@pyqtSlot()
    def run_func():
        run="""
        import os
        import sys
        from setup import *
        print('toto')
        print('titi')
        """
        from multiprocessing import Pool   
        pool = Pool(processes=4)          
        asyncResult = pool.apply_async(exec(run),{},{}),range(1)

【问题讨论】:

  • 您的 GUI 是否在 setup.py 中启动?启动它不受if __name__ == "__main__": 保护吗?另外,你为什么不直接创建一个常规函数并调用apply_async 呢?以你现在的方式使用exec 是不对的。
  • 谢谢达诺。我的 GUI 没有在 setup.py 中启动。我有一个 Main,它启动一个 QApplication,它启动我的 QMainWindow。然后我的 QMainWindow 通过 QAction 启动 run_func()。我可以直接在 apply_async 中启动一个函数,你是对的,但它不能解决多重启动。

标签: python user-interface import pyqt multiprocessing


【解决方案1】:

您没有为您的问题提供太多背景信息。无论如何,我做了一个测试,从run 字符串中删除了from setup import * 部分。并且一切运行良好,因此,这不是 PyQT 问题,更像是在某些时候您再次执行运行 GUI 的模块/函数。

第一个问题:

我建议您使用调试器并在启动 GUI 的位置设置一些断点,然后您可以使用调用堆栈来确定谁在调用您的 GUI。这样你就会知道'ma​​in'代码块的去向,即使它真的有必要。

由于调试器使用 pdb 和代码内断点(记住你是在多进程中运行),请输入以下行:

import pdb; pdb.set_trace()

你想在哪里设置断点。

第二个问题:

见,How do I unload (reload) a Python module?

【讨论】:

  • 感谢您的回答。我发现了很多问题,我认为多处理不是我想要的。我正在寻找一种在我的 GUI 之外运行脚本的方法。我想在容器或类似的东西中运行脚本。
  • 再发一个问题,我相信你会在这里找到帮助的。
  • 谢谢,我发了。link
猜你喜欢
  • 2021-07-24
  • 2020-08-14
  • 2016-11-10
  • 2017-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
  • 2016-12-07
相关资源
最近更新 更多