python - 运行时错误:多处理(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 行, 主要"
解决方案
您必须设置多处理上下文和启动方法
就我而言,我不得不使用上下文“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 上的所有父进程可继承句柄。
推荐阅读
- python - 如何在弹出窗口中保存我的复选框的值
- r - 在闪亮的服务器上运行闪亮的应用程序
- c# - Xamarin.Forms 编译绑定不适用于 DataTemplate
- oracle - 在 Oracle 存储过程中为参数添加前缀 N
- python - 如何在python中计算向量和矩阵之间的相似距离之前对数据进行归一化?
- javascript - React Shows 中的 Reducer:无法将 undefined 或 null 转换为对象
- android - 如何在android中的按钮单击上放置外部链接?
- javascript - 有没有办法通过node.js访问不是主要方法的Java类?
- typescript - 打字稿如何使用可选链接
- javascript - Firebase - 如何将 UTC 时间戳转换为 UTC-5?