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选择以及我遇到的坑的更多相关文章

  1. 【python库模块】Python subprocess模块功能与常见用法实例详解

    前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...

  2. python算法与数据结构-选择排序算法(33)

    一.选择排序的介绍 选择排序(Selection sort)是一种简单直观的排序算法.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素, ...

  3. Python排序算法之选择排序定义与用法示例

    Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...

  4. python subprocess popen 静默模式(不弹出console控制台)

    python subprocess popen 静默模式(不弹出console控制台) import subprocess,sys IS_WIN32 = 'win32' in str(sys.plat ...

  5. 真香!Python开发工程师都选择这个数据库:因为它免费

    数据库类别 既然我们要使用关系数据库,就必须选择一个关系数据库. 目前广泛使用的关系数据库也就这么几种: 付费的商用数据库: Oracle,典型的高富帅: SQL Server,微软自家产品,Wind ...

  6. python subprocess相关操作

    python subprocess常用操作 1.subprocess模块的常用函数 函数 描述 subprocess.run() Python 3.5中新增的函数.执行指定的命令,等待命令执行完成后返 ...

  7. Python subprocess.Popen communicate() 和wait()使用上的区别

    之所以会纠结到这个问题上是因为发现在调用Popen的wait方法之后程序一直没有返回.google发现wait是有可能产生死锁的.为了把这个问题彻底弄清楚,搜索一些资料过来看看: 原文链接:http: ...

  8. python subprocess阻塞

    import select import os import subprocess import time import fcntl args = ['python','./fetch_file2.p ...

  9. python subprocess 自动运行实验室程序

    import threading, os, subprocess, time exec_path = "/home/xhz/gems/ruby/amd...../bin/tester.exe ...

随机推荐

  1. .net Core学习笔记之MemoryCache

    .NET Core支持多种不同的缓存,其中包括MemoryCache,它表示存储在Web服务器内存中的缓存:     内存中的缓存存储任何对象; 分布式缓存界面仅限于byte[] 1:在.net co ...

  2. Spring学习之路

    (一)搭建Spring.NET环境常见的DLL 1.spring.core --整个框架的基础,实现了依赖注入的功能 2.Spring.AOP--提供面向方面编程(aop)的支持 3.Spring.D ...

  3. Open JDk 源码下载地址

    OpenJDK 和Oracle JDK 共用了大量相同的代码,在性能.功能和执行逻辑上都和Oracle JDK非常一致,由于 现在Oracle JDK是闭源的,我们可以下载Open JDK的源码来研究 ...

  4. Apache Spark Exception in thread “main” java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class

    问题: 今天用Maven搭建了一个Spark的Scala项目,运行后遇到下面异常: Apache Spark Exception in thread “main” java.lang.NoClassD ...

  5. Spring系列之——spring security

    1 搭建springboot 2 配置pom依赖(springboot版本为2.1.3) <dependency> <groupId>org.springframework.b ...

  6. mybatis自动生成代码,逆向工程

    https://gitee.com/yangliuwin/mybatis_reverse_engineering.git

  7. vue+element ui 的上传文件使用组件

    前言:工作中用到 vue+element ui 的前端框架,使用到上传文件,则想着封装为组件,达到复用,可扩展.转载请注明出处:https://www.cnblogs.com/yuxiaole/p/9 ...

  8. 浅谈TCP/IP(new 常见面试问题)

    1. TCP/IP重传机制,如何保证消息读到一个完整内容再反序列化 2. TCP四次回收比三次握手多了什么操作,什么时候会进入Time_await状态 3.

  9. Emscripten编译环境搭建--将C和C++编译成JS

    Emscripten编译环境搭建--将C和C++编译成JS 需求:linux环境下用js执行c.c++文件,使用emscirpten编译器 目标:搭建好Emscripten环境 环境:Ubuntu16 ...

  10. CSS 高度(css height)

    DIV+CSS height高度知识教程篇 DIV CSS高度简介这里的CSS高度是指通过CSS来控制设置对象的高度.使用CSS属性单词height.单位可以使用PX,em等常用使用PX(像素)为ht ...