multiprocessing在Python中的池异步方法的错误

13 浏览
0 Comments

multiprocessing在Python中的池异步方法的错误

我在Windows机器上尝试使用Threading和Multiprocessing编写我的第一个正式Python程序。然而,我无法启动进程,Python给出了以下错误信息。问题在于,我没有在main模块中启动我的线程。线程是在一个独立的模块中的类中处理的。

编辑:顺便说一下,这段代码在Ubuntu上运行良好,但在Windows上运行不太好。

运行时错误:
在当前进程完成引导阶段之前,尝试启动新进程。
这可能意味着你在Windows上忘记在主模块中使用正确的做法:
if __name__ == '__main__':
    freeze_support()
    ...
如果程序不会被冻结以生成Windows可执行文件,则可以省略"freeze_support()"行。

我的原始代码非常长,但是我能够在代码的简化版本中复制出这个错误。代码分为两个文件,第一个是主模块,除了导入处理进程/线程的模块并调用一个方法之外,几乎没有其他操作。第二个模块是代码的核心部分。


testMain.py:

import parallelTestModule
extractor = parallelTestModule.ParallelExtractor()
extractor.runInParallel(numProcesses=2, numThreads=4)


parallelTestModule.py:

import multiprocessing
from multiprocessing import Process
import threading
class ThreadRunner(threading.Thread):
    """这个类表示一个正在运行的线程实例"""
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        print self.name,'\n'
class ProcessRunner:
    """这个类表示一个正在运行的进程实例"""
    def runp(self, pid, numThreads):
        mythreads = []
        for tid in range(numThreads):
            name = "Proc-"+str(pid)+"-Thread-"+str(tid)
            th = ThreadRunner(name)
            mythreads.append(th) 
        for i in mythreads:
            i.start()
        for i in mythreads:
            i.join()
class ParallelExtractor:    
    def runInParallel(self, numProcesses, numThreads):
        myprocs = []
        prunner = ProcessRunner()
        for pid in range(numProcesses):
            pr = Process(target=prunner.runp, args=(pid, numThreads)) 
            myprocs.append(pr) 
#        if __name__ == 'parallelTestModule':    #这个方法不起作用
#        if __name__ == '__main__':              #这显然不起作用
#        multiprocessing.freeze_support()        #在看到错误后添加,但无效
        for i in myprocs:
            i.start()
        for i in myprocs:
            i.join()

0
0 Comments

在Python中,使用多进程时,在Windows系统上可能会出现错误。错误信息为“multiprocessing error on python pool async method”。下面是解决该问题的原因和方法。

问题的原因是,当使用多进程时,可能会导致启动一个新的Python解释器,从而引发意外的副作用。为了避免这种情况,需要将代码放在一个主函数内,并使用if __name__ == '__main__'进行判断。

解决方法是将代码放在一个名为testMain.py的文件中,并将其作为主函数。具体代码如下:

import parallelTestModule
if __name__ == '__main__':
  extractor = parallelTestModule.ParallelExtractor()
  extractor.runInParallel(numProcesses=2, numThreads=4)

此外,可以参考Python官方文档中的说明,文档链接为http://docs.python.org/2/library/multiprocessing.html。文档中指出,使用if __name__ == '__main__'的目的是确保主模块可以在新的Python解释器中安全地导入,而不会引发意外的副作用。

通过以上方法,可以解决在使用多进程时可能出现的“multiprocessing error on python pool async method”错误。

0