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系统中安装VSCode(Visual Studio Code)

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

  2. Linux系统中的Device Mapper学习

    在linux系统中你使用一些命令时(例如nmon.iostat 如下截图所示),有可能会看到一些名字为dm-xx的设备,那么这些设备到底是什么设备呢,跟磁盘有什么关系呢?以前不了解的时候,我也很纳闷. ...

  3. Linux 系统中的MySQL数据库默认区分大小写

    今天在开发中遇到这么个问题,将连接的数据库改为服务器上的时候(服务器是Linux系统的),程序跑起来后一直出错,总提示数据库的表找不到, 而打开数据库看该表明明是存在的,在我的印象中MySQL数据是不 ...

  4. Linux 系统中僵尸进程

    Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸.配图源 ...

  5. Linux系统中配置jdk

    在Linux系统下安装jdk 1.到Oracle公司的官网里下载好jdk,网址 http://www.oracle.com/technetwork/java/javase/downloads/jdk8 ...

  6. Linux 系统中用户切换

    1. Linux系统中用户切换的命令为su,语法为: su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]] 参 ...

  7. 77 swapon-激活Linux系统中交换空间

    Linux swapon命令用于激活Linux系统中交换空间,Linux系统的内存管理必须使用交换区来建立虚拟内存. 语法 /sbin/swapon -a [-v] /sbin/swapon [-v] ...

  8. 腾讯云Linux系统中启动自己安装的tomcat

    腾讯云Linux系统中启动自己安装的tomcat 首先通过工具查看一下安装的tomcat的位置 进入命令行之后输入以下指令: 此时,tomcat已经启动了.

  9. [转]理解Linux系统中的load average

    转自:http://heipark.iteye.com/blog/1340384 谢谢,写的非常好的文章. 一.什么是load average linux系统中的Load对当前CPU工作量的度量 (W ...

随机推荐

  1. ppmoney 总结一

    1.JQ $.get() <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. hive 搭建

    Hive hive是简历再hadoop上的数据库仓库基础架构,它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储,查询和分析存储再hadoop种的大规模数据机制,hive定 ...

  3. 【leetcode❤python】 189. Rotate Array

    #-*- coding: UTF-8 -*-#由于题目要求不返回任何值,修改原始列表,#因此不能直接将新生成的结果赋值给nums,这样只是将变量指向新的列表,原列表并没有修改.#需要将新生成的结果赋予 ...

  4. HeadFirst 设计模式

    一.设计原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松紧耦合设计而努力 对扩展开放,都修稿关闭 依赖抽象,不要依赖具体类 最少知识原则:之和朋友交谈 好莱坞原则: ...

  5. div的一些易出错地方

    1.div中放一张图片老是显示不出来? 解决方法如下: 设置一下div的宽度与高度,然而此时直接写width与height是不对的,对于块级元素没有这个属性,只能在style="width: ...

  6. HighCharts中Y轴颜色设置

    yAxis: [{ title: { text: '', style: { color: '#2EBBD9' } }, labels: { formatter: function () { retur ...

  7. jquery easyui的treegrid的控制

    其中列的formatter很有作用,可以得到你想要的任何内容: 例: <table class="easyui-treegrid" id="tg" dat ...

  8. JAVA GC 简单总结

    GC分代 GC的英文全拼是Garbage Collection,意思是垃圾收集. Java 将堆内存分为三代来管理: - 年轻代 (Young Generation) - 年老代 (Old Gener ...

  9. SQL脚本循环修改数据库字段类型

    数据库在设计的时候也许考虑不全面,导致某些字段类型不太准确.比如设计的时候是varchar(1024),但是实际使用的时候却发现太小了,装不下,于是需要修改字段类型为ntext什么的. 我最近就遇到了 ...

  10. hdu 3336【Count the string】(KMP)

    一道字符串匹配的题目,仅仅借此题练习一下KMP 因为这道题目就是要求用从头开始的n个字符串去匹配原来的字符串,很明显与KMP中求next的过程很相似,所以只要把能够从头开始匹配一定个数的字符串的个数加 ...