当前位置: 首页 > 面试题库 >

Windows上的RuntimeError尝试Python多处理

阴永福
2023-03-14
问题内容

我正在Windows机器上尝试使用Threading and
Multiprocessing的第一个正式python程序。我无法启动进程,但是python给出了以下消息。问题是,我没有在
模块中启动线程。线程在类内的单独模块中处理。

编辑 :顺便说一句,此代码在ubuntu上运行良好。在窗户上不太

RuntimeError: 
            Attempt to start a new process before the current process
            has finished its bootstrapping phase.
            This probably means that you are on Windows and you have
            forgotten to use the proper idiom in the main module:
                if __name__ == '__main__':
                    freeze_support()
                    ...
            The "freeze_support()" line can be omitted if the program
            is not going to be frozen to produce a Windows executable.

我的原始代码很长,但是我能够以节略的版本重现该错误。它分为两个文件,第一个是主模块,除了导入处理进程/线程和调用方法的模块外,几乎没有其他作用。第二个模块是代码的关键所在。

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):
    """ This class represents a single instance of a running thread"""
    def __init__(self, name):
        threading.Thread.__init__(self)
        self.name = name
    def run(self):
        print self.name,'\n'

class ProcessRunner:
    """ This class represents a single instance of a running process """
    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':    #This didnt work
#        if __name__ == '__main__':              #This obviously doesnt work
#        multiprocessing.freeze_support()        #added after seeing error to no avail
        for i in myprocs:
            i.start()

        for i in myprocs:
            i.join()

问题答案:

在Windows上,子进程将在启动时导入(即执行)主模块。您需要if __name__ == '__main__':在主模块中插入防护,以避免递归创建子流程。

已修改testMain.py

import parallelTestModule

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


 类似资料:
  • 问题内容: 更新: 建议删除行// =require_tree。已解决此问题。 我浪费了超过2天的时间来尝试遵循所有建议并解决我的问题。我正在尝试在Windows机器上关注http://ruby.railstutorial.org一书,但我一生无法克服以下令人讨厌的错误。 我尝试了所有建议,包括使用msi安装nodejs,使用execjs 1.3.0以及其他我什至不记得的东西。这是 gem文件 这

  • 更新:Colin关于删除行//=require_tree的建议。已经解决了这个问题。 我已经浪费了两天的时间,试图遵循每一个建议,并解决我的问题。我正在尝试在windows机器上学习http://ruby.railstutorial.org的书籍,但我一辈子都无法克服以下严重的错误。 我已经尝试了每一个建议,包括在msi中安装nodejs,使用ExecJS1.3.0和其他我已经记不清楚的东西。这是

  • 问题内容: 这段代码在linux上执行,但是抛出AttributeError:类型对象“ T”在Windows上没有属性“ val”,为什么? 问题答案: Windows缺少系统调用,该系统调用重复了当前过程。这有很多含义,包括Windows多处理文档页面上列出的含义。进一步来说: 请记住,如果在子进程中运行的代码尝试访问全局变量,则它看到的值(如果有)可能与调用Process.start时父进程

  • Windows 10上的更新似乎一夜之间就打破了Python。只是尝试运行python--version返回了一个“权限被拒绝”错误。三次更新都没有;KB4507453、KB4506991或KB4509096看起来可能是罪魁祸首,但问题发生的时间令人怀疑。我希望有一个更简单的解决方案,我没有错过,而不是忙于回滚。 python上的权限是“-rwxr-xr-x”,在安装了昨晚的补丁程序之后,除了让W

  • 问题内容: 在Python中,一个语句是否可以有多个语句?如 : 问题答案: 对的,这是可能的。 请参阅:http : //docs.python.org/tutorial/errors.html 关键字“ as”用于将错误分配给变量,以便稍后可以在代码中更彻底地调查错误。另请注意,在python 3中需要三重异常情况的括号。

  • 问题内容: 我正在尝试学习python,正在制作一个将输出脚本的程序。我想使用os.path.join,但是很困惑。根据文档,如果我说: 我懂了。根据文档,这是正常的,对吗? 但是,当我使用copytree命令时,Python将以所需的方式输出它,例如: 这是我得到的错误代码: 如果我用换行,则会得到相同的错误。 如果不能以这种方式使用它,那么我对其目的感到困惑。 根据Stack Overflow