【问题标题】:Python multiprocessing process vs. standalone Python VMPython 多处理进程与独立 Python VM
【发布时间】:2010-02-16 20:33:23
【问题描述】:

除了multiprocessing 模块在使用通信资源连接进程时易于使用之外,使用multiprocessing 生成多个进程与使用subprocess 启动单独的Python VM 相比是否还有其他区别?

【问题讨论】:

    标签: python multiprocessing virtual-machine


    【解决方案1】:

    在 Posix 平台上,multiprocessing 原语本质上包装了 os.fork()。这意味着,当您在多处理中生成一个进程时,已经导入/初始化的代码仍然保留在子进程中。

    如果你有很多东西要初始化,然后每个子进程本质上对那些初始化的对象执行操作(副本),这可能是一个福音,但如果你在子进程中运行的东西完全不相关,这并不是很有帮助。

    在类 unix 平台上,multiprocessing 对资源(例如文件句柄、套接字等)也有影响。

    同时,当使用subprocess 时,每次Popen 一个新进程时,您都会创建一个全新的程序/解释器。这意味着它们之间的共享内存可能会减少,但这也意味着您可以 Popen 进入一个完全独立的程序,或进入同一程序的新入口点。

    在 Windows 上,multiprocessingsubprocess 之间的差异较小,因为 windows 不提供 fork()

    【讨论】:

    • 微软在 Windows 的高端版本中确实提供了fork()。详情请见我的answer
    • @PiotrDobrogost 但我不相信 Windows 上的“多处理”会利用这一点。
    • 从 Python 3.4+ 开始,您可以选择在 *nix 系统上使用 spawn 系统调用
    【解决方案2】:

    如果您忽略任何通信问题(即,如果单独的 Python VM 之间不进行通信,或者仅通过明确建立的其他机制进行通信),则没有其他实质性差异。 (我相信multiprocessing,在某些条件下——尤其是类Unix平台——可以使用更有效的fork,而不是multiprocessing总是暗示的fork-exec对——但这不是“实质性的”当只涉及几个进程时[[IOW,启动时的性能差异对整个系统的性能没有影响]])。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 2022-06-15
      • 2015-12-20
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      相关资源
      最近更新 更多