孤儿进程

父进程先于子进程退出,此时子进程就会成为孤儿进程。

  孤儿进程会被系统指定的进程收养,即系统进程会成为该孤儿进程新的父进程。孤儿进程退出时该父进程会处理退出状态

僵尸进程

子进程先于父进程退出,父进程没有处理子进程退出状态,此时子进程会成为僵尸进程

  * 僵尸进程已经结束,但是会滞留部分PCB信息的内存,大量的僵尸会消耗系统的内存资源,应该尽量避免

如何避免僵尸进程的产生:

父进程处理子进程的退出状态

pid,status = os.wait()

功能:在父进程中阻塞等待处理子进程的退出

返回值:pid  退出的子进程的PID号

    status  子进程的退出状态

  1. import os,sys
  2. from time import sleep
  3.  
  4. pid = os.fork()
  5.  
  6. if pid < 0:
  7. print("create process failed")
  8. elif pid == 0:
  9. sleep(3)
  10. print("子进程PID:",os.getpid()) # 子进程PID: 4150
  11. sys.exit(3)
  12. else:
  13. #等待子进程退出
  14. pid,status = os.wait()
  15. print(pid,status) # 4150 768
  16. print(os.WEXITSTATUS(status)) #获取退出状态 3
  17. while True:
  18. pass

pid,status = os.wait()

pid,status = os.waitpid(pid,option)

功能:同wait

参数:pid  -1  表示任意子进程退出

       >0  整数  指定PID号的子进程

  option  0    表示阻塞等待

      os.WNOHANG  表示非阻塞

返回值:同wait

waitpid(-1,0)  = => wait() 

  1. import os,sys
  2. from time import sleep
  3.  
  4. pid = os.fork()
  5.  
  6. if pid < 0:
  7. print("create process failed")
  8. elif pid == 0:
  9. sleep(3)
  10. print("子进程PID:",os.getpid())
  11. sys.exit(3)
  12. else:
  13. #等待子进程退出
  14. while True: # 不断地循环监听
  15. sleep(1)
  16. pid,status = os.waitpid(-1,os.WNOHANG) # -1等待任意子进程退出 非阻塞
  17. print(pid,status)
  18. if os.WEXITSTATUS(status): # >0 如果WIFEXITED非零,返回子进程退出码
  19. break
  20. print("do something others")
  21. while True:
  22. pass
  23.  
  24. # 0 0
  25. # do something others
  26. # 0 0
  27. # do something others
  28. # 子进程PID: 4698
  29. # 0 0
  30. # do something others
  31. # 4698 768

pid,status = os.waitpid(-1,os.WNOHANG)

父进程先退出

创建二级子进程

  1、父进程创建子进程等待子进程退出

  2、子进程创建二级子进程,然后马上退出

  3、二级子进程成为孤儿,处理具体事件

  1. # 创建二级子进程处理僵尸进程
  2. import os
  3. from time import sleep
  4.  
  5. def fun1():
  6. sleep(3)
  7. print("第一件事情")
  8.  
  9. def fun2():
  10. sleep(4)
  11. print("第二件事情")
  12.  
  13. pid = os.fork()
  14.  
  15. if pid < 0:
  16. print("Create process error")
  17. elif pid == 0: # 子进程
  18. # 创建二级进程
  19. pid0 = os.fork()
  20. if pid0 < 0:
  21. print("创建二级进程失败")
  22. elif pid0 == 0: # 子子进程
  23. fun2() # 做第二件事
  24. else: # 子进程
  25. os._exit(0) # 二级进程退出
  26. else:
  27. os.wait()
  28. fun1() # 做第一件事
  29.  
  30. # tarena@tedu:~/桌面$ python3 1.py
  31. # 第一件事情
  32. # tarena@tedu:~/桌面$ 第二件事情

创建二级子进程处理僵尸进程

multiprocessing 模块创建进程

1. 需要将要做的事情封装成函数
2. 使用multiprocessing提供的类Process创建进程对象
3. 通过进程对象和Process初始化进程进行进程的设置,绑定函数
4. 启动进程,会自动执行绑定的函数
5. 完成进程的回收

创建进程对象
Process()  创建进程对象
参数: target : 要绑定的函数
name : 给进程起的名称 (默认Process-1)
args: 元组 用来给target函数位置传参
kwargs : 字典 用来给target函数键值传参

p.start()
功能 : 启动进程 自动运行terget绑定函数。此时进程被创建

p.join([timeout])
功能: 阻塞等待子进程退出
参数: 超时时间

* 使用multiprocessing创建进程子进程同样复制父进程的全部内存空间,之后有自己独立的空间,执行上互不干扰
* 子进程也是有自己特有的PID等资源
* 如果不使用join回收可能会产生僵尸进程
* 使用multiprocessing创建子进程,一般父进程功能就是创建子进程回收子进程,所有事件交给子进程完成

  1. import multiprocessing as mp
  2. from time import sleep
  3. import os
  4.  
  5. a = 1
  6.  
  7. def fun():
  8. sleep(2)
  9. print("子进程事件",os.getpid())
  10. global a
  11. a = 10000
  12. print("a = ",a)
  13.  
  14. p = mp.Process(target = fun) # 创建进程对象
  15. p.start() # 启动进程
  16. sleep(3)
  17. print("这是父进程")
  18. p.join() # 回收进程
  19. print("parent a:",a)
  20.  
  21. # 子进程事件 5434
  22. # a = 10000
  23. # 这是父进程
  24. # parent a: 1

Process(target)

pythonNET day05的更多相关文章

  1. python学习菜单

    一.python简介 二.python字符串 三.列表 四.集合.元组.字典 五.函数 六.python 模块 七.python 高阶函数 八.python 装饰器 九.python 迭代器与生成器  ...

  2. My way to Python - Day05 - 面向对象-思维导图

    My way to Python - Day05 - 面向对象   思维导图

  3. day05 Servlet 开发和 ServletConfig 与 ServletContext 对象

    day05 Servlet 开发和 ServletConfig 与 ServletContext 对象 1. Servlet 开发入门 - hello world 2. Servlet 的调用过程和生 ...

  4. python day05笔记总结

    2019.4.2 S21 day05笔记总结 一.昨日内容回顾与补充 1.extend(列表独有功能) 循环添加到一个列表中 a.有列表users = ['张三',‘李四]   people = [' ...

  5. Python基础(协程函数、内置函数、递归、模块和包)-day05

    写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04  ...

  6. Python之路PythonNet,第四篇,网络4

    pythonnet   网络4 select  支持水平触发 poll       支持水平触发 epoll epoll 也是一种IO多路复用的方式,效率比select和poll 要高一点: epol ...

  7. Python之路PythonNet,第三篇,网络3

    pythonnet   网络3 udp 通信 recvfrom sendtofork 多进程并发threading 多线程并发socketserver 系统模块 套接字的属性 setsockopt g ...

  8. Python之路PythonNet,第二篇,网络2

    pythonnet   网络2 问题: 什么是七层模型tcp 和udp区别三次握手和四次挥手************************************************** tcp ...

  9. Python之路PythonNet,第一篇,网络1

    pythonnet   网络1 ARPAnet(互联网雏形)--->  民用 ISO(国际标准化组织)--->网络体系结构标准 OSI模型 OSI : 网络信息传输比较复杂需要很多功能协同 ...

随机推荐

  1. HDU 1565 方格取数(1)(最大点权独立集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...

  2. lua if 流程控制

    Lua认为false和nil为假,true和非nil为真. 要注意的是Lua中 0 为 true --[ 为 true ] ) then print("0 为 true") end ...

  3. Linux下weblogic启动报错unable to get file lock的问题

    非正常结束weblogic进程导致weblogic无法启动 由于先前服务器直接down掉了,所有进程都非正常的进行关闭了,也就导致了下次启动weblogic的时候报了以下错误:<2012-3-2 ...

  4. oracle修改约束列

    Oracle 增加修改删除字段 添加字段的语法:alter table tablename add (column datatype [default value][null/not null],-. ...

  5. 彻底明白IP地址——计算相关地址

    知道ip地址和子网掩码后可以算出: 1. 网络地址 2. 广播地址 3. 地址范围 4. 本网有几台主机 例1:下面例子IP地址为192·168·100·5 子网掩码是255·255·255·0.算出 ...

  6. prim和kruskal比较

    推荐:http://squirrelrao.iteye.com/blog/1044867  http://www.cnblogs.com/xwdreamer/archive/2011/06/16/22 ...

  7. android中LayoutInflater.from(context).inflate的分析

    在应用中自定义一个view,需要获取这个view的布局,需要用到 (LinearLayout) LayoutInflater.from(context).inflate(R.layout.conten ...

  8. New Concept English Two 20 52

    $课文50  乘车兜风 510. I love travelling in the country, but I don't like losing my way. 我喜欢在乡间旅行,但却不愿意迷路. ...

  9. Qt Creator 模块QtSql

    在新建Qt Gui Application时,没有弹出模块选择页, 可以手动在pro文件中增加. 比如要选中QtSql模块,(目前我没有找到哪里可以修改要选中的模块), 我是手动在pro文件中增加了一 ...

  10. LARC Caffe笔记(一) Setup

    采用杂记的形式 从查找到知乎页面开始:https://www.zhihu.com/question/27982282 到mnist example页面:http://caffe.berkeleyvis ...