Python多处理模块进程引发运行时错误而不执行任何操作

Python多处理模块进程引发运行时错误而不执行任何操作,python,python-2.7,multiprocessing,Python,Python 2.7,Multiprocessing,我正在尝试使用Python2.7中的多处理模块来创建一个带有wxpython的gui,该gui在一个进程中调用一个单独的模块,该进程将使用matplotlib绘制图形。然而,每次调用该模块时,gui只打开一个inself的副本。接下来,我尝试在一个简单的示例中使用多处理模块。在空闲状态下,进程似乎可以正常启动,但进程实际上并不运行。当我从命令行运行代码时,会引发attributeerror,但当我将所有MultiProcessing.Process切换到threading.Thread时,代码工

我正在尝试使用Python2.7中的多处理模块来创建一个带有wxpython的gui,该gui在一个进程中调用一个单独的模块,该进程将使用matplotlib绘制图形。然而,每次调用该模块时,gui只打开一个inself的副本。接下来,我尝试在一个简单的示例中使用多处理模块。在空闲状态下,进程似乎可以正常启动,但进程实际上并不运行。当我从命令行运行代码时,会引发attributeerror,但当我将所有MultiProcessing.Process切换到threading.Thread时,代码工作正常

以下是命令行代码:

我以前测试过这个模块,它似乎已经工作了,所以我可能只是在做一些愚蠢的事情,但是我根本无法找出我的错误

编辑:

在我的GUI中,从

queue_thread = multiprocessing.Process(
            target=simple_queue_model.main_func, args = (self.inputs,))
致:

导致调用进程,但是主GUI窗口会冻结,直到进程完成运行,并且会再次打开一个新的GUI窗口,我不理解这一点

编辑2:
前面的更改只会导致我的GUI将main_func no作为一个单独的进程调用。行
queue\u thread.start()
是导致新GUI生成的原因,因此总体而言,此模块对我来说根本不起作用

当您在Windows上使用
多处理启动新进程时,将启动一个全新的virgin python进程,然后导入所需的各种模块,并使用
pickle
传递变量。在本例中,您已经在交互式会话的
\uuuuu main\uuuu
命名空间中定义了函数。要让它们运行,请将它们保存到可以从新进程导入的y=模块中。一定要咨询医生


相反,线程可以共享内存,并直接从当前命名空间传递函数定义

谢谢你的帮助!在阅读了文档并在进行了您建议的更改后进行了进一步的测试之后,我意识到该过程正在工作,但是在我的gui中,我将stdout从另一个模块重定向到textctrl,并通过多处理调用此模块函数。process()阻止这种重定向的发生(在IDLE中,打印语句根本不打印,在cmd中,它们打印在cmd中)这就是为什么我认为这个过程根本不起作用。有没有想过如何解决这个问题?@user3666665我认为要做到这一点,您需要显式地将句柄传递给
target
函数,并将
target
函数中的stdout重定向到该句柄,或者将
target
中的
stdout
重定向到
多处理.Queue
多处理.Pipe
。然后让父进程中的一个线程接收正在发布的消息,并让该线程使用您使用的GUI框架提供的任何线程安全机制更新textctrl。如果您有tro,可能值得再问一个问题让它工作起来吧。你考虑过使用IPython.parallel或其他库吗?坦白说,当你开始处理对GUI的访问和来回传递数据时,在Windows上进行多处理是一件痛苦的事情。对于我的用途,我使用套接字发送子进程的反馈,如下所示()我之所以使用多处理,是因为我希望我的gui调用一个单独的模块来进行计算,然后在不冻结gui的情况下绘制结果。当我像过去一样只使用线程模块时,我只能调用这个模块一次,我读入了需要使用多处理libra的其他stackoverflow线程相反,我希望它能在多个通话中正常工作。(虽然这样做了,但也带来了一系列其他问题)。不过,我会看看你的建议,谢谢。如果你认为还没有得到回答,请随时询问你关于线程的问题。
queue_thread = multiprocessing.Process(
            target=simple_queue_model.main_func(self.inputs))