pythonNET day05

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。pythonNET day05,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

孤儿进程

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

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

僵尸进程

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

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

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

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

pid,status = os.wait()

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

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

    status  子进程的退出状态

pythonNET day05
pythonNET day05

 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() 

pythonNET day05
pythonNET day05

 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、二级子进程成为孤儿,处理具体事件

pythonNET day05
pythonNET day05

 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创建子进程,一般父进程功能就是创建子进程回收子进程,所有事件交给子进程完成

pythonNET day05
pythonNET day05

 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)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/159329.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!