【问题标题】:Multiprocessing throwing Runtime Error after executing p.start()执行 p.start() 后多处理抛出运行时错误
【发布时间】:2021-07-23 12:05:36
【问题描述】:

我的代码在 python 中执行 Multiprocessing 包的 p.start() 方法后出现运行时错误。

记录的错误如下:

Traceback(最近一次调用最后一次):文件 "/Users/anujpanchal/Documents/exportify-micro-booking/functionality/Notifications.py", 第 396 行,在 send_notification 中 p.start() 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/process.py”, 第 121 行,开始 self._popen = self._Popen(self) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py”, 第 224 行,在 _Popen 返回 _default_context.get_context().Process._Popen(process_obj) 文件 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/context.py", 第 284 行,在 _Popen 返回 Popen(process_obj) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py”, 第 32 行,在 init 中 super().init(process_obj) 文件 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_fork.py", 第 19 行,在 init 中 self._launch(process_obj) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/popen_spawn_posix.py”, 第 42 行,在 _launch prep_data = spawn.get_preparation_data(process_obj._name) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/spawn.py”, 第 154 行,在 get_preparation_data 中 _check_not_importing_main() 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/spawn.py”, 第 134 行,在 _check_not_importing_main 引发 RuntimeError(''' RuntimeError: 已尝试在 当前进程已完成其引导阶段。

    This probably means that you are not using fork to start your
    child processes 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 an executable.

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次):文件“”,第 1 行,in 文件 "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/spawn.py", 第 116 行,在 spawn_main exitcode = _main(fd, parent_sentinel) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/spawn.py”, 第 125 行,在 _main 准备(preparation_data)文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/spawn.py”, 第 236 行,准备中 _fixup_main_from_path(数据['init_main_from_path'])文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/spawn.py”, 第 287 行,在 _fixup_main_from_path main_content = runpy.run_path(main_path,文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py”, 第 268 行,在 run_path 返回_run_module_code(代码,init_globals,run_name,文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py”, 第 97 行,在 _run_module_code _run_code(代码,mod_globals,init_globals,文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/runpy.py”, 第 87 行,在 _run_code 中 exec(代码,run_globals)文件“/Users/anujpanchal/Documents/exportify-micro-booking/functionality/Notifications.py”, 第 513 行,在 通知(checkpoint="discharged_on_transshipment").send_notification(booking_id="XPF100283", tracking_obj=tracking_obj, scraper_update=False) 文件 "/Users/anujpanchal/Documents/exportify-micro-booking/functionality/Notifications.py", 第 470 行,在 send_notification 中 return response.errorResponse("发生了一些错误,请重试!") 文件 “/Users/anujpanchal/Documents/exportify-micro-booking/functionality/response.py”, 第 50 行,错误响应 返回jsonify(响应),状态文件“/Users/anujpanchal/Documents/exportify-micro-booking/venv/lib/python3.9/site-packages/flask/json/init.py”, 第 339 行,在 jsonify 中 如果 current_app.config['JSONIFY_PRETTYPRINT_REGULAR'] 或 current_app.debug:文件 “/Users/anujpanchal/Documents/exportify-micro-booking/venv/lib/python3.9/site-packages/werkzeug/local.py”, 第 348 行,在 getattr 中 返回getattr(self._get_current_object(),名称)文件“/Users/anujpanchal/Documents/exportify-micro-booking/venv/lib/python3.9/site-packages/werkzeug/local.py”, 第 307 行,在 _get_current_object 中 返回 self.__local() 文件“/Users/anujpanchal/Documents/exportify-micro-booking/venv/lib/python3.9/site-packages/flask/globals.py”, 第 51 行,在 _find_app 中 引发 RuntimeError(_app_ctx_err_msg) RuntimeError:在应用程序上下文之外工作。

这通常意味着您尝试使用以下功能 需要以某种方式与当前应用程序对象交互。 要解决此问题,请使用 app.app_context() 设置应用程序上下文。 有关详细信息,请参阅文档。

为什么会抛出这种类型的运行时错误,是因为我将 MacBook 更新到 Big Sur 11.3 还是因为其他原因?

【问题讨论】:

    标签: python python-3.x multiprocessing runtime-error python-multiprocessing


    【解决方案1】:

    我对 Mac 了解不多。一般来说,我相信大多数版本都使用(或曾经使用)操作系统调用fork 来创建新进程。这意味着您不必将创建新进程的代码放在一个块中,例如 ...

    if __name__ == '__main__':
    

    ... 这是使用操作系统调用spawn 来创建新进程的平台所必需的,原因是当使用spawn 时,新进程是通过初始化一个新地址空间来创建的,启动一个新的 Python 解释器并从程序的最顶部重新运行代码,在全局范围内重新执行代码。如果上述if 语句没有条件地执行该代码,这将导致在递归循环中重新执行无限创建新进程的代码。

    似乎在您对 Big Sur 11.3 的更新中,创建新进程的新默认方法已从 fork 切换到 spawn -- 这可能是有充分理由的。所以我很犹豫地建议你先尝试调用...

    multiprocessig.set_start_method('fork')
    

    ...恢复fork 作为用于创建新进程的默认方法。

    相反,我建议您将您的流程创建代码包含在上述if 块中。很遗憾你决定不发布任何代码,否则我本可以向你展示如何做到这一点。

    【讨论】:

      猜你喜欢
      • 2020-09-19
      • 1970-01-01
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多