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开始执行的时候才调用。解决了此问题
python subprocess 和 multiprocess选择以及我遇到的坑的更多相关文章
- 【python库模块】Python subprocess模块功能与常见用法实例详解
前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...
- python算法与数据结构-选择排序算法(33)
一.选择排序的介绍 选择排序(Selection sort)是一种简单直观的排序算法.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...
- python subprocess popen 静默模式(不弹出console控制台)
python subprocess popen 静默模式(不弹出console控制台) import subprocess,sys IS_WIN32 = 'win32' in str(sys.plat ...
- 真香!Python开发工程师都选择这个数据库:因为它免费
数据库类别 既然我们要使用关系数据库,就必须选择一个关系数据库. 目前广泛使用的关系数据库也就这么几种: 付费的商用数据库: Oracle,典型的高富帅: SQL Server,微软自家产品,Wind ...
- python subprocess相关操作
python subprocess常用操作 1.subprocess模块的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返 ...
- Python subprocess.Popen communicate() 和wait()使用上的区别
之所以会纠结到这个问题上是因为发现在调用Popen的wait方法之后程序一直没有返回.google发现wait是有可能产生死锁的.为了把这个问题彻底弄清楚,搜索一些资料过来看看: 原文链接:http: ...
- python subprocess阻塞
import select import os import subprocess import time import fcntl args = ['python','./fetch_file2.p ...
- python subprocess 自动运行实验室程序
import threading, os, subprocess, time exec_path = "/home/xhz/gems/ruby/amd...../bin/tester.exe ...
随机推荐
- 阿里云提示ECS服务器存在漏洞处理方法
1.阿里云提供生成修复命令,但是这个只提供给企业版,即收费的: 2.自己手动修复的话, 采用软件升级一般都可以解决.除了提示带kernel的高危漏洞的,其他的不需要重启实例即可修复. 有kernel的 ...
- 导出为shape文件
private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)//导出为s ...
- JavaScript 正则表达式RegExp 和字符串本身的正则表达式
JavaScript 正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模 ...
- SQL存储过程基础语法及实例
1.定义变量简单赋值 declare @a int //声明一个变量a 赋初值为5 print @a //输出变量a 2.创建临时表 if OBJECT_ID('tempdb.#FlightState ...
- redis入门基础
环境: centos 一.安装 sudo su cd wget http://labfile.oss.aliyuncs.com/courses/106/redis-2.8.4.tar.gz tar - ...
- 聊聊MyBatis缓存机制【美团-推荐】
聊聊MyBatis缓存机制 2018年01月19日 作者: 凯伦 文章链接 18778字 38分钟阅读 前言 MyBatis是常见的Java数据库访问层框架.在日常工作中,开发人员多数情况下是使用My ...
- node.js和JavaScript的关系
node.js是一个基于 Chrome V8 引擎的 JavaScript 运行时环境. 一.类比JavaScript和java JavaScript java V8 JVM node.js JRE ...
- POJ3126(KB1-F BFS)
Prime Path Description The ministers of the cabinet were quite upset by the message from the Chief ...
- 【学习笔记】--- 老男孩学Python,day10, 函数, 动态参数 命名空间\作用域 global nonlocal
1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序:位置---*args---默认值---**kwargs 在形参上*聚合, **聚合 在实参上*打散, ...
- BZOJ3451:Tyvj1953 Normal
根据期望的线性性,答案就是 \(\sum\) 每个连通块出现次数的期望 而每个连通块次数的期望就是 \(\sum\) 连通块的根与每个点连通次数的期望 也就是对于一条路径 \((i,j)\),设 \( ...