新手无法让concurrent.futures正常工作

17 浏览
0 Comments

新手无法让concurrent.futures正常工作

我正在尝试在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