python subprocess 和 multiprocess选择以及我遇到的坑

The subprocess option:

subprocess is 用来执行其他的可执行程序的,即执行外部命令。 他是os.fork() 和 os.execve() 的封装。 他启动的进程不会把父进程的模块加载一遍。使用subprocess的通信机制比较少,通过管道或者信号机制.

The multiprocessing option:

multiprocessing 用来执行python的函数,他启动的进程会重新加载父进程的代码。可以通过Queue、Array、Value等对象来通信。

 

一个坑:

我今天遇到一个问题,A进程用subprocess启动进程B,B进程用multiprocess启动进程C,C进程用subprocess启动D。其中A和B有导入的依赖,就是说B导入的时候会导入一个包(执行__init__.py),这个包A也会导入。

我在__init__.py初始化了全局的资源,在B内部导入的模块也有初始化全局资源的操作。

启动结果是A进程启动正常;B进程启动的时候,执行了A的资源初始化(资源浪费问题);C进程启动的时候执行了B的资源初始化;D进程启动正常。

我一直在思考,为什么B会执行A的,C会执行B的?最终我发现,是因为AB共同导入了一个包,这个包下__init__.py执行了初始化,根据python的导入机制,AB都会初始化全局资源。

那为啥C启动的时候会执行B的全局初始化呢?C进程是执行一个py文件,没有任何B相关的依赖,其仅依赖独立的模块。我后来将B的全局初始化放入函数(根据导入模块机制,这样在模块被加载的时候不会执行这个代码),发现C不会再执行B的初始化代码。

这里的结论是:用multiprocess启动的进程会将父进程加载过的模块重新加载一遍,导致C初始化了B的全局资源,最后我将B的全局资源放到函数内初始化,main开始执行的时候才调用。解决了此问题

 

转载于:https://www.cnblogs.com/pengyusong/p/6113148.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值