【发布时间】:2010-02-16 20:33:23
【问题描述】:
除了multiprocessing 模块在使用通信资源连接进程时易于使用之外,使用multiprocessing 生成多个进程与使用subprocess 启动单独的Python VM 相比是否还有其他区别?
【问题讨论】:
标签: python multiprocessing virtual-machine
除了multiprocessing 模块在使用通信资源连接进程时易于使用之外,使用multiprocessing 生成多个进程与使用subprocess 启动单独的Python VM 相比是否还有其他区别?
【问题讨论】:
标签: python multiprocessing virtual-machine
在 Posix 平台上,multiprocessing 原语本质上包装了 os.fork()。这意味着,当您在多处理中生成一个进程时,已经导入/初始化的代码仍然保留在子进程中。
如果你有很多东西要初始化,然后每个子进程本质上对那些初始化的对象执行操作(副本),这可能是一个福音,但如果你在子进程中运行的东西完全不相关,这并不是很有帮助。
在类 unix 平台上,multiprocessing 对资源(例如文件句柄、套接字等)也有影响。
同时,当使用subprocess 时,每次Popen 一个新进程时,您都会创建一个全新的程序/解释器。这意味着它们之间的共享内存可能会减少,但这也意味着您可以 Popen 进入一个完全独立的程序,或进入同一程序的新入口点。
在 Windows 上,multiprocessing 和 subprocess 之间的差异较小,因为 windows 不提供 fork()。
【讨论】:
fork()。详情请见我的answer。
如果您忽略任何通信问题(即,如果单独的 Python VM 之间不进行通信,或者仅通过明确建立的其他机制进行通信),则没有其他实质性差异。 (我相信multiprocessing,在某些条件下——尤其是类Unix平台——可以使用更有效的fork,而不是multiprocessing总是暗示的fork-exec对——但这不是“实质性的”当只涉及几个进程时[[IOW,启动时的性能差异对整个系统的性能没有影响]])。
【讨论】: