python不同系统下多进程启动方式
在Python中,subprocess.Popen用于创建新的进程。这个创建过程是由操作系统的底层机制来执行的,并不是由Python的多进程库multiprocessing决定。subprocess.Popen在内部使用的是操作系统提供的API来启动新进程,并不直接受multiprocessing库的控制。
在 macOS(以及 Unix-like 系统)中,Python 的 subprocess.Popen 以及多进程模块 multiprocessing 默认使用的是 fork 方式来创建新的进程。当你使用 fork 时,子进程是通过复制父进程的内存空间来创建的,包括其执行状态。
然而,从 Python 3.8 开始,对于 macOS(以及其他 POSIX 兼容系统),multiprocessing 模块的默认启动方式从 fork 改为了 spawn。原因是使用 fork 方法可能会在多线程程序中引起问题,因为 fork 只会复制正在执行 fork 系统调用的线程,而其他线程全部不会被复制。
需要注意的是,这一更改只影响 multiprocessing 模块的默认行为,不影响 subprocess.Popen。subprocess.Popen 仍然使用 fork 作为其创建子进程的方式。
如果使用的是multiprocessing模块来创建进程,可以控制进程的创建方式。在Python 3.4及以后版本,multiprocessing模块支持三种进程启动方法:
fork:父进程使用自己的内存空间作为模板来创建子进程。
spawn:父进程启动一个新的Python解释器进程,然后只加载必要的资源来运行子进程。
forkserver:当程序启动时,创建一个服务器进程。以后每次需要创建一个新进程时,父进程就会连接服务器并请求它创建一个新的子进程。这种方法只在Unix-like系统上可用。
在Python中设置multiprocessing的默认启动方法:
import multiprocessing
multiprocessing.set_start_method('spawn') # 可以是 'fork', 'spawn', 或 'forkserver'
参考:https://xujinzh.github.io/2023/08/26/python-multiprocessing-freeze-support/index.html