运行时错误:多处理(python 3.9)

运行时错误:多处理(python 3.9),python,Python,我试图运行此处可用的代码,但出现以下错误。你知道我该怎么解决吗 child processes and you have forgotten to use the proper idiom main 在 模块: 如果名称main freeze=support()-- 如果程序“ “返回池(进程、初始值设定项、initargs、rnaxtasksperchild,” 文件“C:\Python39\lib\multiprocessing\pool

我试图运行此处可用的代码,但出现以下错误。你知道我该怎么解决吗

child processes and you have forgotten to use the proper idiom                          
main

模块:
如果名称main freeze=support()--
如果程序“
“返回池(进程、初始值设定项、initargs、rnaxtasksperchild,”
文件“C:\Python39\lib\multiprocessing\pool.py”,第212行,在init中“
文件“C:\Python39\lib\multiprocessing\pool.py”,第303行,返回self.\u repopulate\u pool\u static(self.\u ctx,self.Pro)
文件“C:\Python39\lib\multiprocessing\pool.py”,第326行,“
w、 开始()
“C:\Python39\lib\multiprocessing\process.py”,第121行,在start lf中。\u popen=self.\u popen(self)“
_静态
“在池污水中重新填充,”
在重新填充池中
文件se
文件re”““C:\Python39\lib\multiprocessing\context.py”“,第327行,依次为Popen(process\u obj)”\u Popen 文件“C:\Python39\lib\multiprocessing\popen\u spawn\u win32.py”,第45行

prep_data=spawn.get_preparation_data(进程对象名称)
“文件”c:\Python39\lib\multiprocessing\spawn.py“,第154行,在get\u preparation\u data中”
_选中“不导入”
main()
main
“文件”“C:\Python39\lib\multiprocessing\spawn.py”“,第134行,在检查\u not \u导入raise RuntimeError(”“””
运行时错误:
之前
已尝试启动新进程当前进程已完成其引导阶段。
这可能意味着您没有使用fork来

您的
开始
子进程,而您忘记了在主模块中使用正确的习惯用法:
如果名称main reeze_support()
如果程序“

“l.py”“”
“文件”“C:\Python39\lib\multiprocessing\poo”
“第326行,在重新填充池静态中”
文件“C:\Python39\lib\multiprocessing\process.py”,第121行,在开始“
文件“C:\Python39\lib\multiproce ssin\context.”第327行,在Popen中

附言:我尝试添加
if\uuuuuuuu name\uuuuuuu='\uuuuu main\uuuuuuuuu':pool=pool(12)pool.map(run,args)

回溯(最近的最后一次呼叫):回溯(最近的最后一次呼叫): 文件“”,第1行,在回溯中(最近的上次调用):回溯(最近的上次调用): 文件“”,第1行,在中 文件“c:\Python39\lib\rrultiprocessing\spawn.py”,第116行,在spawn\u main exitcode=\u main(fd,父\u sentinel)中 文件“c:\Python39\lib\rrultiprocessing\spawn.py”,第125行,在main中 文件“c:\Python39\lib\r多重处理\spawn.py”,第116行,在中的spawn\u主文件“”第1行中 回溯(最后一次重新调用): 回溯(上次重新调用):文件“”,第1行,在 文件“c:\Python39\lib\r多重处理\spawn.py”,第125行,主准备(准备数据) 文件“c:\Python39\lib\multiprocessing\spawn.py”,第236行,在prepare中 _从路径修复主路径(数据['init\u main\u from\u path']) “文件”“c:\Python39\lib\multiprocessing\spawn.py”“,第287行,位于\u fixup\u main\u from\u path main\u content=runpy.run\u path(main\u path,” 文件“c:\Python39\lib\runpy.py”,第268行,在运行路径返回模块代码(代码,初始化全局,运行名称)中 文件“c:\Python39\lib\runpy.py”,第97行,在_run_module_code exitcode=_main(fd,parent_sentinel)中 “文件”“c:\Python39\lib\multiprocessing\spawn.py”“第116行,在spawn\u主文件”“c:\Python39\lib\multiprocessing\spawn.py”“第116行,在spawn\u主文件”“第1行,在中” 回溯(最近一次调用):文件“”,第1行,在 文件“c:\Python39\lib\rrultiprocessing\spawn.py”,第125行,在main“

您必须设置

在我的例子中,我必须利用上下文“fork”

ctx = multiprocessing.get_context('fork')
work_queue    = ctx.Queue()
results_queue = ctx.Queue()
...
 workers = get_worker_processes(
    _process_data,
    (task_function, work_queue, results_queue),
    nproc=nproc,
)          
.....
workers = [
    ctx.Process(target=f, args=args) for _ in range(num_procs)
]   
请遵循Python多处理文档中针对所引用链接提供的指导。请注意默认值中的更改

上下文和启动方法取决于平台、多处理 支持三种启动流程的方法。这些启动方法包括

spawn父进程启动一个新的python解释器进程。 子进程将只继承运行所需的资源 进程对象的run()方法。尤其是不必要的文件 父进程的描述符和句柄将不会被继承。 使用此方法启动进程比使用 fork或forkserver

在Unix和Windows上可用。默认值在Windows和macOS上

fork父进程使用os.fork()来fork Python解释器。 子进程在开始时实际上与 父进程。父进程的所有资源都由子进程继承 注意,安全地分叉多线程进程是非常重要的 有问题

仅在Unix上可用。在Unix上为默认值

当程序启动并选择forkserver启动时使用forkserver 方法,启动服务器进程。从那时起,每当 进程,父进程连接到服务器并 请求它分叉一个新进程。分叉服务器进程是单进程 线程化,因此使用os.fork()是安全的。没有不必要的 资源是继承的

在支持传递文件描述符的Unix平台上可用 通过Unix管道

在版本3.8中更改:在macOS上,spawn start方法现在是 默认值。fork start方法应被视为不安全的 导致子流程崩溃。请参阅bpo-33725

在版本3.4中更改:在所有unix平台上添加了spawn,以及 为某些unix平台添加了forkserver。子进程不再 继承Windows上的所有父级可继承句柄


请澄清代码格式如果name='main':pool=pool(12)pool.map(run,args),则我添加了此if条件,其余代码与要复制的代码相同