首页 > 解决方案 > 运行时错误:多处理(python 3.9)

问题描述

我正在尝试运行此处提供的代码https://github.com/GDPlumb/MAPLE/blob/master/1-Accuracy/run.py但出现以下错误。知道我该如何解决

child processes and you have forgotten to use the proper idiom                          


模块中的main
:
if name main freeze=support() -- "如果程序 " "return Pool(processes, initializer, initargs, rnaxtasksperchild," "File ""C ,
则可以省略 ""freeze_support()"" 行:\Python39\lib\multiprocessing\pool.py"",第 212 行,在 init" "文件 ""C:\Python39\lib\multiprocessing\pool.py"",第 303 行,返回 self._repopulate_pool_static(self._ctx , self.Pro" "文件 ""C:\Python39\lib\multiprocessing\pool.py"",第 326 行," w.start() """C:\Python39\lib\multiprocessing\process.py"" ,第 121 行,开始 lf._popen = self._Popen(self)" _repopulate_pool 文件中的 _static "in _repopulate_pool cess "










文件 re """C:\Python39\lib\multiproce ssing\context.py"",第 327 行,依次 Popen(process_obj)" _Popen "文件 ""C:\Python39\lib\multiproce ssing\popen_spawn_win32.py" “,第 45 行,”

prep_data = spawn .get_preparation_data(process_obj._name)
"文件 ""c:\Python39\lib\multiprocessing\spawn .py"",第 154 行,在 get_preparation_data"
_check_not_importing
main ()
main
"File ""C:\Python39\lib \multiprocessing\spawn .py"",line 134,in check_not_importing raise RuntimeError ('''"
RuntimeError :
before
尝试启动新进程当前进程已完成其引导阶段。
这可能意味着您没有使用fork 到


启动
子进程,您忘记在主模块中使用正确的习惯用法:
if name main reeeze_support()

“如果程序”是
“l.py”, 则可以省略“”freeze_support()“”行,
“文件”“C:\Python39\lib\multiprocessing\poo”
“第326行,在_repopulate_pool_static”
“文件""C:\Python39\lib\multiprocessing\process.py"",第 121 行,在开始中"
"文件 ""C:\Python39\lib\multiproce ssin \context.""第 327 行,在 Popen 中"

PS:我尝试添加if __name__ == '__main__': pool = Pool(12) pool.map(run, args)

Traceback(最近一次调用最后一次):Traceback(最近一次调用最后一次):“文件”,第1行,在Traceback(最近一次调用最后一次):Traceback(最近一次调用最后一次):“文件”“”” , 第 1 行, 在 ""File ""c:\Python39\lib\rrultiprocessing\spawn .py"", 第 116 行, 在 spawn_main exitcode = _main(fd, parent_sentinel)" "File ""c:\Python39\lib\ rrultiprocessing\spawn .py"",第 125 行,在 main" "文件 ""c:\Python39\lib\rnultiprocessing\spawn .py"",第 116 行,在 spawn_main 文件中 """",第 1 行,在 "Traceback (roost 最近调用最后一次): "Traceback (roost 最近调用最后一次): 文件 """", 第 1 行, 在 " "文件 ""c:\Python39\lib\rnultiprocessing\spawn.py'',第 125 行,在主准备(preparation_data)中“文件”“c:\Python39\lib\multiprocessing\spawn .py”,第 236 行,在准备中“_fixup_main_from_path(数据['init_main_from_path'])“文件”“c: \Python39\lib\multiprocessing\spawn .py"",第 287 行,在 _fixup_main_from_path 中 main_content = runpy.run_path(main_path,""文件""c:\Python39\lib\runpy.py'',第 268 行,在 run_path 中返回_run_module_code(code, init_globals, run_name," "File ""c:\Python39\lib\runpy.py'', 第 97 行,在 _run_module_code 中 exitcode = _main(fd, parent_sentinel)" "File ""c:\Python39\lib \multiprocessing\spawn .py"",第 116 行,在 spawn_main 文件中 ""c:\Python39\lib\multiprocessing\spawn .py"",第 116 行,在 spawn_main 文件中""'',第 1 行,在 " "Traceback(最近一次调用最后一次)中:文件 """",第 1 行,在 ""文件 ""c:\Python39\lib\rrultiprocessing\spawn .py'',第 125 行, 主要"

标签: python

解决方案


您必须设置多处理上下文和启动方法

就我而言,我不得不使用上下文“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启动方式时,一个服务器进程被启动。从那时起,每当需要一个新进程时,父进程都会连接到服务器并请求它派生一个新进程。fork 服务器进程是单线程的,因此使用 os.fork() 是安全的。没有不必要的资源被继承。

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

在 3.8 版更改: 在 macOS 上,spawn start 方法现在是默认值。fork start 方法应该被认为是不安全的,因为它可能导致子进程崩溃。请参阅 bpo-33725。

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


推荐阅读