zoukankan      html  css  js  c++  java
  • 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开始执行的时候才调用。解决了此问题

  • 相关阅读:
    R 误差自相关与DW检验
    R WLS矫正方差非齐《回归分析与线性统计模型》page115
    R 再也不用愁变量太多跑回归太麻烦!R语言循环常用方法总结
    R 读取回归模型的信息
    R 创建一个空的数据框
    R 《回归分析与线性统计模型》page93.6
    自编函数
    ntpdate 正确的做法
    利用yum升级Centos6的gcc版本,使其支持C++11
    Python Shell 中敲击方向键显示「^[[C^[[D],问题解决
  • 原文地址:https://www.cnblogs.com/pengyusong/p/6113148.html
Copyright © 2011-2022 走看看