Python多进程进程与独立的Python虚拟机对比

18

除了在使用 multiprocessing 模块时连接进程与通信资源更加易用之外,使用 multiprocessing 产生多个进程与使用 subprocess 启动单独的 Python VM 之间还有其他的区别吗?

2个回答

23
在Posix平台上,multiprocessing基本上是对os.fork()的封装。这意味着在你生成一个进程时,导入/初始化的代码在子进程中仍然存在。
如果你需要初始化很多东西,并且每个子进程基本上都是对这些初始化对象(拷贝)执行操作,那么这可能会有所帮助,但如果子进程中运行的内容完全不相关,则没有太多帮助。
在类Unix平台上,使用 multiprocessing 还涉及到文件句柄、套接字等资源的问题。
同时,当使用 subprocess 时,每次 Popen 新进程都会创建一个全新的程序/解释器。这意味着它们之间可以共享的内存比较少,但也意味着你可以在一个完全独立的程序或同一程序的新入口点上 Popen。
在Windows上,multiprocessingsubprocess 的差别较小,因为Windows不提供fork()

2
微软在高端版本的Windows中提供了fork()。有关详细信息,请参见我的答案 - Piotr Dobrogost
@PiotrDobrogost 但我不相信在Windows上的“多进程”会利用这一点。 - Crast
你可以选择在Python 3.4+版本中在*nix系统上使用spawn系统调用。 - ospider

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接