孤儿进程

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

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

僵尸进程

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

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

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

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

pid,status = os.wait()

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

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

    status  子进程的退出状态

 import os,sys
 from time import sleep

 pid = os.fork()

 if pid < 0:
     print("create process failed")
 elif pid == 0:
     sleep(3)
     print("子进程PID:",os.getpid())    # 子进程PID: 4150
     sys.exit(3)
 else:
     #等待子进程退出
     pid,status = os.wait()
     print(pid,status)   # 4150 768
     print(os.WEXITSTATUS(status)) #获取退出状态  3
     while True:
         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() 

 import os,sys
 from time import sleep

 pid = os.fork()

 if pid < 0:
     print("create process failed")
 elif pid == 0:
     sleep(3)
     print("子进程PID:",os.getpid())
     sys.exit(3)
 else:
     #等待子进程退出
     while True:    # 不断地循环监听
         sleep(1)
         pid,status = os.waitpid(-1,os.WNOHANG)    # -1等待任意子进程退出 非阻塞
         print(pid,status)
         if os.WEXITSTATUS(status):    # >0 如果WIFEXITED非零,返回子进程退出码
             break
         print("do something others")
     while True:
         pass

 # 0 0
 # do something others
 # 0 0
 # do something others
 # 子进程PID: 4698
 # 0 0
 # do something others
 # 4698 768

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

父进程先退出

创建二级子进程

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

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

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

 # 创建二级子进程处理僵尸进程
 import os
 from time import sleep 

 def fun1():
     sleep(3)
     print("第一件事情")

 def fun2():
     sleep(4)
     print("第二件事情")

 pid = os.fork()

 if pid < 0:
     print("Create process error")
 elif pid == 0:    # 子进程
     # 创建二级进程
     pid0 = os.fork()
     if pid0 < 0:
         print("创建二级进程失败")
     elif pid0 == 0:    # 子子进程
         fun2()  # 做第二件事
     else:    # 子进程
         os._exit(0)    # 二级进程退出
 else:
     os.wait()
     fun1() # 做第一件事

 # tarena@tedu:~/桌面$ python3 1.py
 # 第一件事情
 # 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创建子进程,一般父进程功能就是创建子进程回收子进程,所有事件交给子进程完成

 import multiprocessing as mp
 from time import sleep
 import os

 a = 1

 def fun():
     sleep(2)
     print("子进程事件",os.getpid())
     global a
     a = 10000
     print("a = ",a)

 p = mp.Process(target = fun)    # 创建进程对象
 p.start()   # 启动进程
 sleep(3)
 print("这是父进程")
 p.join()    # 回收进程
 print("parent a:",a)

 # 子进程事件 5434
 # a =  10000
 # 这是父进程
 # 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. Postman模拟json传参

    首先在headers中,设置Content-Type为applicationon/json,如图: 然后再body中,选择raw,写入json数据结构,如图:

  2. 谈谈WPF中的CollectionView与CollectionViewSource

    https://www.cnblogs.com/zhouyinhui/archive/2007/12/07/987076.html

  3. 套用EVAL

    <%#getSimple(setHeight(Eval("File").ToString(), searchTxt, false), 340)%>

  4. 记一次生产环境axis2服务特别慢的问题。

    情况如下: 某服务,在测试环境测试的时候整个响应过程也就0.5s左右,测试环境和生产环境axis2版本一致,tomcat版本一致,但是生产环境需要差不多20S. 后来,越来越慢,导致服务一起来,整个生 ...

  5. javascript---关于字符串和数组的方法

    在学习javascript过程中,遇到过很多关于数组和字符串的一些操作.之前也总结了不少方法,可是一遇到自己用的时候,就忘了.不是忘了方法叫什么名,就是忘了方法的参数有什么,返回的是什么? 现在就再次 ...

  6. .NET连接MongoDB数据库实例教程

    这则小窍门将讲述如何开发一个.NET应用来连接Mongo数据库并执行多种操作.同时还稍微涉及了Mongo数据库和多种命令. 使用代码 让我们从Mongo数据库的一些细节和基本命令开始,并最终介绍如何创 ...

  7. C++轮子队

    团队Github地址:https://github.com/Pryriat/2048.git 团队展示: 队名:C++轮子队 队员组成: 黄家承(队长)              学号:3116005 ...

  8. Python基础学习----参数和返回值

    # 函数的参数和返回值 # 4种组合方式 # 1.无参无返 # def methodone(): # 2.无参有返 def methodtwo(): a=10 return a # 3.有参无返 # ...

  9. Centos 7 系统详解

      安装CentOS 7系统后,变化竟然这么大? 一.Runlevel首先一条,原来一直用的CentOS-6.5-x86_64-minimal.iso光盘镜像(400M左右无图形系统小巧便捷),而7目 ...

  10. web 开发 css 默认值列表

    css默认值列表 HTML标签CSS属性默认值汇总 这个东西,在你需要还原默认值的时候,比较有用. 开始的时候 *{margin:0;padding:0;},当需要使用边距的时候,就需要还原HTML默 ...