linux下python 创建子进程的原理: os.fork()方法 的原理

为了实现并发、多任务,我们可以在主程序种开启一个进程或者线程。
在类unix操作系统当中(非windows),可以用python的os.fork() 方法 在主进程上创建一个子进程 os.fork():
这句话执行过后,就会创建出一个新的进程来,被我们创建出来的进程我们叫她子进程,当前进程我们叫它主进程
子进程会复制主进程所有内容,包括代码、变量、各种资源。他们两个一摸一样,
两个进程此时同时从os.fork()结束的那个时间点向下执行相同的代码。
这个方法有一个返回值,在主进程中接收到的返回值是子进程的pid、子进程中接收到的是0
获得当前进程的pid: os.getpid()
获得当前进程父进程的pid: os.getppid() 执行下面代码,如果在ide中,发现子进程不一定会不会输出信息。如果在终端中,发现子进程信息和主进程信息都会输出。
因为两个进程之间相互独立,我们能控制的只是当前主进程,如果主进程子进程先结束了,就不等子进程的输出消息了。
 import os
pid = os.fork()
if pid == 0:
print("我是子进程%s,我的父进程是%s"%(os.getpid,os.getppid ) )
else:
print("我是父进程%s,我创建了子进程%s"%( os.getpid,pid ))
进程产生垃圾:
僵尸进程: 子进程先死掉,父进程还没死掉的父进程
孤儿进程:父进程死了,子进程还没死掉的子进程 在操作系统中,子进程死掉后,内存等资源都由父进程进行管理回收和释放
如果子进程还没结束,父进程就运行结束了,那么创建出来的子进程就会产生系统垃圾没有其它进程负责释放
所以 主进程创建出来的子进程要主进程自己进行管理,把他们收集回收资源
父进程用os.wait() 可以进行资源回收,会返回两个值 进程的pid 和 一个整数:0代表成功 负数代表失败
 import os

 pid = os.fork()
#子进程会进入这个分支
if pid == 0 :
print("我是子进程%s,我的父进程是%s"%( os.getpid(),os.getppid() ))
#父进程会进入这个分支
else :
print("我是父进程%s,我创建了子进程%s"%( os.getpid(),pid ))
print("我要收集子进程资源:")
son_pid , result = os.wait()
print(son_pid , result )
进程之间不共享变量:
进程是独立占一部分内存空间的
如果我们在主进程中创建一个子进程,子进程是在当前主进程之外申请了一块额外内存,把主进程所有代码和资源复制一份自己来运行。
所以,主进程和子进程是不共享全局变量的。他们分别在自己的内存空间当中维护自己的变量空间
 import os
import time
num = 100
pid = os.fork()
#子进程当中
if pid == 0 :
print("这里是子进程:")
print(num)
num = 10
print( num )
#主进程中
else:
time.sleep(3)
print("这里是主进程:")
print( num )
在程序中多次调用fork()
一共会产生多少进程??? 当一个进程调用了fork() 都会生成另一个子进程
然后当前进程和子进程同时fork()语句继续向下执行
 import os
os.fork() #主进程会产生一个子进程,两个进程从这里开始继续向下进行
os.fork() #两个进程到这里,分别会给自己创建一个子进程,结果 会有四个进程从这里继续向下
os.fork() # 四个进程到这里,每个进程都会给自己再创建一个子进程。结果会形成八个进程
print("哈哈哈") #会打印出八条哈哈哈
												

python多进程--------linux系统中python的os.fork()方法的更多相关文章

  1. Linux系统中python默认版本为python2.7,修改为python3 项目上传码云

    # 查询系统本系统中安装的python版本 ls -l /usr/bin/python* 1.在虚拟机上新建虚拟环境 # 系统中python默认版本为python2.,可以将其修改为python3 # ...

  2. linux系统中python版本升级

    一,查看python版本号 python -V 二,下载需要升级到python版本包下载地址https://www.python.org/ftp/python/ 根据需要选择需要的python版本 e ...

  3. Jmeter(五十三) - 从入门到精通高级篇 - 懒人教你在Linux系统中安装Jmeter(详解教程)

    1.简介 我们绝大多数使用的都是Windows操作系统,因此在Windows系统上安装JMeter已经成了家常便饭,而且安装也相对简单,但是服务器为了安全.灵活小巧,特别是前几年的勒索病毒,现在绝大多 ...

  4. python进行linux系统监控

      python进行linux系统监控 Linux系统下: 静态指标信息: 名称 描述 单位 所在文件 mem_total 内存总容量 KB /proc/meminfo disks 磁盘相关信息 - ...

  5. Python多进程库multiprocessing中进程池Pool类的使用[转]

    from:http://blog.csdn.net/jinping_shi/article/details/52433867 Python多进程库multiprocessing中进程池Pool类的使用 ...

  6. rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少?

    rpm 系 linux 系统中 repo 文件中的 $release 到底等于多少? 结论 对于 8 来说,通过以下命令 #/usr/libexec/platform-python -c 'impor ...

  7. 在Linux系统中安装caffe

    学习深度学习已经很久了,但一直没有自己动手安装过caffe,因为工作需要,需要在linux系统中安装caffe,因此,在这里对安装过程进行记录. caffe配置起来比tensorflow更麻烦一些,我 ...

  8. 在Linux系统中部署NodeJS项目

    在Linux系统中部署NodeJS项目 安装NodeJS 首先进入 Node 官网,下载对应的 Node包 下载下来后是一个后缀为 xz 的压缩包,我们把这个包上传到 Linux 系统中的 /usr/ ...

  9. 在linux系统中安装VSCode(Visual Studio Code)

    在linux系统中安装VSCode(Visual Studio Code) 1.从官网下载压缩包(话说下载下来解压就直接可以运行了咧,都不需要make) 访问Visual Studio Code官网  ...

随机推荐

  1. SignalR Self Host+MVC等多端消息推送服务(2)

    一.概述 上次的文章中我们简单的实现了SignalR自托管的服务端,今天我们来实现控制台程序调用SignalR服务端来实现推送信息,由于之前我们是打算做审批消息推送,所以我们的demo方向是做指定人发 ...

  2. Filecoin2017年Q4进度更新(完整版)

    亲爱的Filecoin支持者.矿工.用户.投资者和广大的社区朋友们, 自从Token销售完成以后,我们便开始集中精力把Filecoin项目从设想变为现实-从实现Filecoin协议的核心代码到打造我们 ...

  3. JSON基础(JavaScript)

    1.在JS中使用JSON,先将字符转换为JOSN格式然后就可以直接使用: var obj = JSON.parse(cInfoObj) $('#staffName').val(obj.candidat ...

  4. Runtime的使用

    一.RunTime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...

  5. float与double的精度和范围

    1 范围 float和double的范围是由指数的位数来决定的. float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bi ...

  6. 【Python】 uuid生成唯一ID

    uuid uuid是128位的全局唯一标识符(univeral unique identifier),通常用32位的一个字符串的形式来表现.有时也称guid(global unique identif ...

  7. 详细分析du和df的统计结果为什么不一样

    今天有个人问我du和df的统计结果为什么会不同.给他解析了一番,后来想想还是写篇文章从原理上来分析分析. 我们常常使用du和df来获取目录或文件系统已占用空间的情况.但它们的统计结果是不一致的,大多数 ...

  8. java程序性能调优---------------性能概述

    一.程序的性能通过哪几个方面表现 1.执行速度(程序反应反应是否迅速.响应时间是否足够短) 2.分配内存 (分配内存是否合理,是否过多的消耗内存或者内存溢出) 3.启动时间(程序从运行到可以正常处理业 ...

  9. UWP 拖拽文件

    桌面环境下的UWP,加入拖拽模式还是会增加用户好感度的. 好了,先看一下我最新研发的[小微识别]吧,演示一下 炫酷,有没有,

  10. 『开源』设置系统 主音量(0~100 静音) VolumeHelper 兼容 Xp Win7 .Net 20 AnyCPU

    背景: 近来的生活一团乱麻,没心态写高大上的代码,于是就着手 写了几个 辅助类. 在整理 InkFx.Utils 时,发现有几个 辅助类 只写了定义,没有实现函数体,于是就 花了1天时间 完善了一下. ...