multiprocessing在Python中的池异步方法的错误
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()
在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”错误。