繁体   English   中英

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

[英]runtime error: Multiprocessing (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                          

主要的
在里面
模块:
if name main freeze=support() --
"""freeze_support()"" 行可以省略,如果程序"
“返回池(进程,初始化程序,initargs,rnaxtasksperchild,”
"文件 ""C:\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 进程中,”
在 _repopulate_pool
文件服务
文件 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
主要的 ()
主要的
"文件 ""C:\Python39\lib\multiprocessing\spawn.py"",第 134 行,在check_not_importing中引发 RuntimeError ('''"
运行时错误:

已尝试启动一个新进程,当前进程已完成其引导阶段。
这可能意味着您没有使用 fork

您的
开始
子进程并且您忘记在主模块中使用正确的习语:
if name main reeeze_support()
"""freeze_support()"" 行可以省略,如果程序"

"l.py"","
"文件 ""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 最近调用最后一次): 文件 """", line 1, in " "File ""c:\Python39\lib\rnultiprocessing\spawn.py'', line 125,in主要准备(preparation_data)“文件”“c:\Python39\lib\multiprocessing\spawn.py”,第236行,准备中“_fixup_main_from_path(数据['init_main_from_path'])”文件“”c:\Python39\lib \multiprocessing\spawn.py"", line 287,in _fixup_main_from_path main_content = runpy.run_path(main_path," "File ""c:\Python39\lib\runpy.py'', line 268, in run_path return _run_module_c ode(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\rultiprocessing\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启动方式时,一个服务器进程被启动。 从那时起,每当需要一个新进程时,父进程都会连接到服务器并请求它派生一个新进程。 fork 服务器进程是单线程的,因此使用 os.fork() 是安全的。 没有不必要的资源被继承。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM