Python Multiprocessing module processes raising runtime error and do nothing
我试图在python 2.7中使用多处理模块来创建一个带有wxpython的GUI,它在一个将用matplotlib绘制图形的进程中调用一个单独的模块。但是每次调用该模块时,GUI都会打开inself的副本。接下来,我尝试在一个简单的例子中使用多处理模块。在空闲状态下,它似乎可以很好地启动进程,但进程实际上并不运行。当我从命令行运行代码时,会引发一个attributeError,但当我将所有multiprocessing.process切换到threading.thread时,代码工作正常。
以下是命令行代码:http://imgur.com/qucuwrd
我以前测试过这个模块,它似乎已经工作了,所以我可能只是做了一些愚蠢的事情,但是我根本无法找出我的错误!
编辑:
在我的图形用户界面中更改
1 2
| queue_thread = multiprocessing.Process(
target=simple_queue_model.main_func, args = (self.inputs,)) |
到:
1 2
| queue_thread = multiprocessing.Process(
target=simple_queue_model.main_func(self.inputs)) |
导致调用进程,但是主GUI窗口会冻结,直到进程完成运行,并且会再次打开一个我不理解的新GUI窗口。
编辑2:前面的更改只会导致我的GUI将main_func no作为一个单独的进程调用。行queue_thread.start()是导致新的GUI产生的原因,因此总体而言,这个模块对我来说根本不起作用。
当您在Windows上使用multiprocessing启动一个新进程时,将启动一个全新的virgin python进程,该进程随后导入您需要的各种模块,并使用pickle传递变量。在这种情况下,您已经在交互会话的__main__名称空间中定义了函数。要让它们运行,请将它们保存到可以从新进程导入y=的模块中。一定要参考指南。
相反,线程可以共享内存,并直接从当前名称空间传递函数定义。
- 谢谢你的帮助!在完成您建议的更改之后的文档和进一步测试之后,我意识到进程正在工作,但是在我的GUI中,我正在将stdout从另一个模块重定向到textcrl,并通过多处理调用此模块函数。process()阻止了这种重定向的发生(在空闲的打印状态下在命令中,这些内容根本不打印,而是在命令中打印),这就是为什么我认为这个过程根本不起作用的原因。我有什么想法可以解决这个问题吗?
- @用户3666665我认为要做到这一点,您要么显式地将句柄传递给target函数,然后将target函数中的stdout重定向到该句柄,要么将stdout在target中重定向到multiprocessing.Queue或multiprocessing.Pipe。然后让父进程中的一个线程接收正在发布的消息,并让该线程使用所使用的GUI框架提供的任何线程安全机制更新textcrl。如果你很难让它正常工作的话,也许值得再问一个问题。
- 您是否考虑过使用ipython.parallel或其他库?坦率地说,当您开始处理对GUI的访问并来回传递数据时,在Windows上进行多处理是一件痛苦的事情。对于我的使用,我使用如下所示的套接字从子流程发送反馈(docs.python.org/2.7/howto/…)
- 我之所以使用多处理,是因为我希望我的GUI调用一个单独的模块来进行计算,然后在不冻结GUI的情况下对结果进行图形化。当我像以前那样只使用线程模块时,我只能调用这个模块一次,我在其他StackOverflow线程中读取了我需要使用多处理库来让它在多个调用中工作的信息。(尽管如此,它也带来了许多其他问题)。不过,我会看看你的建议,谢谢。
- 如果你不认为线程问题已经得到了解答,可以自由地问你关于线程的问题。