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. 鹅厂优文 | 决策树及ID3算法学习

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:袁明凯|腾讯IEG测试开发工程师 决策树的基础概念 决策树是一种用树形结构来辅助行为研究.决策分析以及机器学习的方式,是机器学习中的 ...

  2. LNMP详解

    目录 Nginx配置    1 PHP解析    1 Mysql操作    3 服务安装    3 连接测试    3 数据配置    3 Blogs建立    4   LNMP 环境 Mysql:1 ...

  3. java安全框架shiro(一)

    第一个简单的案例 ,通过读取.ini文件的方式模拟登陆, 1.通过Factory工厂的getInstance()方法来获取SecurityManager的实例,实例化Factory需要一个ini文件的 ...

  4. 笔记:I/O流-字符集

    Java 库的 java.nio 包用 Charset 类统一了对字符集的转换,支付姐建立了两个字节Unicode码元序列与使用本地字符编码方式的字节序列之间的映射,Charset类使用的时由IANA ...

  5. 1. 初识 Lucene

    在学习Lucene之前呢,我们当然首先要了解下什么是Lucene. 0x01 什么是Lucene ? Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供. Lu ...

  6. NSRC技术分享——自制Linux Rootkit检测工具

    ### 前言 Linux系统中存在用户态与内核态,当用户态的进程需要申请某些系统资源时便会发起系统调用.而内核态如何将系统的相关信息实时反馈给用户态呢,便是通过proc文件系统.如此便营造了一个相对隔 ...

  7. django之urls系统

    Django的urls系统简介 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映 ...

  8. 第1次作业:no blog no fun

    1.先回答老师的问题 第一部分:结缘计算机       读了进入2012 -- 回顾我走过的编程之路后,我试着回顾了我的编程生涯的开始.我最原始的记忆就是老爸教我用电脑玩连连看,那时候的显示器应该是C ...

  9. 个人总结——Beta阶段

    Beta总结 我们在beta 结束之后, 每位写一个博客, 回顾并总结自己的beta过程,哪些方面做的好的,哪些方面做得不足需要改进的 回答问题 分析在Alpha阶段自己提出的五个问题,针对每个问题, ...

  10. Alpha第二天

    Alpha第二天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...