我正在尝试在python 2.7中使用多处理模块来创建一个带有wxpython的gui,它在一个用matplotlib绘制图形的过程中调用一个单独的模块。但是每当它调用该模块时,gui只会打开一份自己的副本。接下来我尝试在一个简单的例子中使用多处理模块。在IDLE中,似乎可以很好地启动流程,但这些流程实际上并没有运行。当我从命令行运行代码时会引发attributeerror,但是当我将所有multiproccessing.Process切换到threading.Thread时,代码工作正常
继承命令行代码: http://imgur.com/QuCUWRD
之前我已经测试了这个模块,它似乎有效,所以我可能只是在做一些愚蠢的事情,但我根本无法弄清楚我的错误!
编辑:
在我的GUI中更改
中的行queue_thread = multiprocessing.Process(
target=simple_queue_model.main_func, args = (self.inputs,))
为:
queue_thread = multiprocessing.Process(
target=simple_queue_model.main_func(self.inputs))
导致进程被调用,但主GUI窗口冻结,直到进程完成运行,并且再次打开一个新的gui窗口,我不明白。
编辑2:
之前的更改只会导致我的GUI将main_func作为一个单独的进程调用。行queue_thread.start()
是导致新GUI生成的原因,因此整个模块对我来说根本不起作用
答案 0 :(得分:2)
当您在Windows上使用multiprocessing
启动新进程时,将启动一个全新的处女python进程,然后导入所需的各种模块并使用pickle
传递变量。在这种情况下,您已在交互式会话的__main__
命名空间中定义了您的函数。要使它们运行,请将它们保存到可以从新进程导入y =的模块。请务必参考guidelines。
相反,线程可以共享内存,并直接从当前命名空间传递函数定义。