pythonNET day05
孤儿进程
父进程先于子进程退出,此时子进程就会成为孤儿进程。
孤儿进程会被系统指定的进程收养,即系统进程会成为该孤儿进程新的父进程。孤儿进程退出时该父进程会处理退出状态
僵尸进程
子进程先于父进程退出,父进程没有处理子进程退出状态,此时子进程会成为僵尸进程
* 僵尸进程已经结束,但是会滞留部分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)
最新文章
- HTML5画布实现方法:
- 【leetcode】Single Number (Medium) ☆
- C#判断文件是复制还是剪切
- Android NDK 开发(二) -- 从Hlello World学起【转】
- bzoj 1798 [Ahoi2009]Seq 维护序列seq
- 动态调用webservice 接口
- oracle归档日志增长过快处理方法
- 解开Android应用程序组件Activity的";singleTask";之谜
- Jmeter性能测试
- python之--------封装
- 一个小时学会Git
- vim下单行长文本的时候卡顿解决办法
- 解决spring3升级到spring4后jackjson报错
- linux 命令 — cut
- Bootstrap modal 模态框垂直居中显示补丁
- Nginx详解二十九:基于Nginx的中间件架构设计
- 数据库启动windows
- Android GUI之Activity、Window、View
- python+selenium自动化软件测试(第3章):unittes
- scala使用hbase新api
热门文章
- JavaScript权威指南--正则表达式
- ES5和ES6中的继承
- HDU 4004 二分
- 谈谈oracle里的join、left join、right join
- IOS-网络(GET请求和POST请求、HTTP通信过程、请求超时、URL转码)
- Spring学习10- bean的生命周期(阿里面试题目两次面试均提到)
- [转载]c语言指针segmentation fault 指针常常错误的小地方
- Git Error: warning: refname &#39;origin/branch-name&#39; is ambiguous.
- Android Studio利用GitHub托管项目
- UE4 游戏中csv配置文件使用