浅谈python多进程-在不同平台下运行报错
在python中要想让程序真正的做到并发执行不可避免的会使用到multiprocessing
这个模块,在项目中可能会遇到如下情景:在Windows系统下编写了一个多进程的脚本,各种测试没有问题后将脚本copy到Linux平台或者Ubuntu平台下去运行,结果程序各种错误,无法成功运行。
上面那个案例是我亲身经历,捣鼓半天没有解决,后来查找资料了解到Python的多进程在不同平台下的默认启动创建子进程的方式不同,导致的错误
在Linux和Ubuntu平台下默认创建子进程的方式都是fork
,而在Windows和Mac平台下却是spawn
可以通过以下代码查看和修改子进程的创建方式
import multiprocessing
if __name__ == "__main__":
# 打印创建子进程方式
print(multiprocessing.get_start_method())
# 修改创建方式
multiprocessing.set_start_method("fork")
那么这两种子进程的创建方式有什么区别呢
- fork:除了必要的启动资源外,其他的变量、包、数据等都是继承父进程的,由于指针指向的同一个变量地址,可能会造成公共变量信息不及时更新等问题,导致程序出错
- spawn:从头构建一个子进程,父进程的数据等拷贝到子进程的空间中,拥有自己的解释器,相当于每个子进程的变量都是单独的。各个进程读取变量相对安全,同时启动也较慢
Windows 系统只支持 spawn,而 Linux/Mac 既支持 spawn 又支持 fork,可根据需要选择