僵尸与孤儿进程

僵尸进程:父进程的子进程结束的时候父进程没有wait()情况下子进程会变成僵尸进程

孤儿进程(无害)
一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

情况1 无害
父进等着子进程都死,回收僵尸进程。

情况2 无害
父进程死了,子进程活着,都要被init进程接管并且回收。

情况3 有害
父进程一直不死,造成了大量僵尸进程。占用了大量的pid号

pid号是有限的。
解决方案:
最直接的办法就是杀死父进程 。

Process用法

之前我们简单介绍了如何用Process实现简单的多线程

join的用法

join 的作用主要是阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait())

join的写法和start类似,一般用于start之后

from multiprocessing import Process
import time
def foo():print('进程  start ')time.sleep(2.3)print('进程  end ')if __name__ == '__main__':p = Process(target=foo)p.start() ## 核心需求就是# time.sleep(5)p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait())print('主')

join的多进程用法

如果不止一个进程的话,join又会被如何使用呢

from multiprocessing import Process
import time
def foo(x):print('进程  start ')time.sleep(x)print('进程  end ')if __name__ == '__main__':p1 = Process(target=foo,args=(1,))p2 = Process(target=foo,args=(2,))p3 = Process(target=foo,args=(3,))start = time.time()p1.start() #p2.start() #p3.start() ## 核心需求就是# time.sleep(5)p3.join() #1sp1.join() #1sp2.join() #1s# 总时长:按照最长的时间计算多一点。end = time.time()print(end-start) #3s多 or 6s多  ?  正解:3s多print('主')

在这种用法中,我们使用了三个进程。我们先将三个进程都启动,随后再同时join。我们会发现最后的结果是3秒多一点。其实这三个进程是同时开始的,当第一个进程结束的时候,第二个和第三个进程已经开始一秒多了,所以最后的结果是3秒多

当然,如果我们一个一个的start然后join也是可以达成串行的结果:

from multiprocessing import Process
import time
def foo(x):print(f'进程{x}  start ')time.sleep(x)print(f'进程{x}  end ')if __name__ == '__main__':p1 = Process(target=foo,args=(1,))p2 = Process(target=foo,args=(2,))p3 = Process(target=foo,args=(3,))start = time.time()p1.start() #p1.join() #p2.start() #p2.join() #p3.start() #p3.join() ## 不如不开,直接穿行调用函数反而快# foo(1)# foo(2)# foo(3)end = time.time()print(end-start) print('主')

只不过这样的总时长反而高于串行,而且代码冗余,没有什么意义

join的多线程用法优化

不知道各位看官有没有觉得之前的进程每个都要写一个start和join,看上去很麻烦吗?如果三个进程还可以接受,那如果更多的进程呢?我们可以依次利用循环对其进行优化

from multiprocessing import Process
import time
def foo(x):print(f'进程{x}  start ')time.sleep(x)print(f'进程{x}  end ')if __name__ == '__main__':start = time.time()p_list = []for i in range(1,4):p = Process(target=foo,args=(i,))p.start()p_list.append(p)print(p_list)for p in p_list:p.join()end = time.time()print(end-start) #3s多 or 6s多  ?  正解:3s多print('主')

这样子代码的效果 是一样的,但是看上去就更加的简单美观了

Process其他用法

pid(),getpid()和getppid()

其他比较常见的用法是pid(),getpid()和getppid(),他们可以分别用在子进程和父进程中。我们可以直接用代码来表示用法

from multiprocessing import Process,current_process
import time,osdef task():print('子进程 start')print('在子进程中查看自己的pid',current_process().pid) # 在子进程中查看自己的pidprint('在子进程中查看父进程的pid',os.getppid()) #time.sleep(200)print('子进程 end')if __name__ == '__main__':p = Process(target=task)p.start()print('在主进程查看子进程的pid',p.pid) # 一定要写在 start()之后print('主进程的pid',os.getpid())print('主进程的父进程pid',os.getppid())print('主')

这些用法都是站在当前进程的角度
os.getpid():获取当前进程的pid
os.getppid():获取当前进程的父进程的pid
子进程对象.pid:获取当前进程的子进程pid

name和is_alive

p.name:进程的名称

p.is_alive():如果p仍然运行,返回True,没有运行则返回False

from multiprocessing import Process,current_process
import time
def foo():print('进程 start')# print('---------------------    ',current_process().name)time.sleep(2)print('进程 end')if __name__ == '__main__':p = Process(target=foo)# p2 = Process(target=foo,name='rocky')p.start()# p2.start()print(p.is_alive()) # Truetime.sleep(5)print(p.is_alive()) # 代码运行完了就算死了 Falseprint(p.name)# print(p2.name)print('主')

terminate()

p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁

from multiprocessing import Process,current_process
import time
def foo():print('进程 start')# print('---------------------    ',current_process().name)time.sleep(4294967)print('进程 end')if __name__ == '__main__':p = Process(target=foo)p.start()p.terminate() # 给操作系统发了一个请求print(p.is_alive()) # Truep.join()print(p.is_alive()) # Falseprint('主')

如上述代码,在使用terminate之后程序并不会睡4294967(sleep所能睡的最大的值,不要问我是怎么知道的),而是会直接结束,当然foo()函数里的所有代码都不会运行,当然,如果你在terminate之前sleep一下的话,那么在执行terminate之前的foo()里的代码还是会运行的

守护进程

守护--》伴随
本质也是一个子进程
主进程的代码执行完毕守护进程直接结束。但是此时主进程可能没有结束.

from multiprocessing import Process
import time
def foo():print('守护进程 start')time.sleep(5)print('守护进程 end')if __name__ == '__main__':p = Process(target=foo)p.daemon = True # 把这个子进程定义为了守护进程p.start()time.sleep(2)print('主')

守护进程在主进程结束后也会直接结束,上述代码中 守护进程 end 并不会被执行

from multiprocessing import Process
import time
def foo():print('守护进程 start')time.sleep(3)print('守护进程 end')def task():print('子进程 start')time.sleep(5)print('子进程 end')if __name__ == '__main__':p = Process(target=foo)p2 = Process(target=task)p.daemon = True # 把这个子进程定义为了守护进程p.start()p2.start()time.sleep(1)print('主')

而子进程则不一样,他并不会随着主进程结束而结束,所以它会变成孤儿进程

转载于:https://www.cnblogs.com/hyc123/p/11528091.html

Process用法与进程详解相关推荐

  1. linux系统编程之进程(八):守护进程详解及创建,daemon()使用

    linux系统编程之进程(八):守护进程详解及创建,daemon()使用 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等 ...

  2. rac的crs进程是做什么的_Oracle rac进程详解

    rac进程详解: 一.RAC后台进程 LMON:LOCK Monitor Processes 也被称为Global enqueue service monitor 监控整个集群状况,维护GCS的内存结 ...

  3. 转:Linux 僵尸进程详解

    Linux 僵尸进程详解 转载:http://www.51testing.com/?uid-225738-action-viewspace-itemid-206225 1.僵尸进程概念: 僵尸进程(Z ...

  4. windows系统各进程详解

    系统各进程详解 下面列出的都是操作系统的进程,而不是程序的进程,记住这些进程并了解他们的工作原理,用途,能让我们对系统进程的理解提升一个级别. system Idle Process系统进程介绍 al ...

  5. Linux进程详解(二)完结

    原创架构师之路2019-08-13 22:08 接Linux进程详解(一) 4. 进程运行 程序运行时大部分进程状态为运行或睡眠.调度算法解决可以跑的运行状态(就绪和运行),剩下的不可以跑的进程就是睡 ...

  6. Windows进程详解!!(精)

    简述以下 以下以Windows XP系统为例介绍 1.最基本的系统进程 此类系统进程是系统运行的必备条件,只有这些进程处于活动状态,系统才能正常运行.因此,它们是不能被结束任务的. winlogon. ...

  7. linux top命令 动态查看进程详解

    文章目录 linux top命令 动态查看进程详解以及使用方法 top命令的输出,可分为上下两个部分 上面部分:整个系统的资源的使用状态 下面部分:单个进程的资源使用状态 上面部分详解: 第一行:由三 ...

  8. C# Timer用法及实例详解

    1.C# Timer用法及实例详解 http://developer.51cto.com/art/200909/149829.htm http://www.cnblogs.com/OpenCoder/ ...

  9. Linux系统守护进程详解

    文中有不对或者有不清楚的地方,请大家告诉我,谢谢!   Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, ...

最新文章

  1. Spring boot的Spring MVC自动配置
  2. hadoop 写入mysql_使用MapReducer将文件写入mysql 数据库
  3. AI赋能DevOps:数据驱动的全栈工程师实践
  4. 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
  5. DataSet and DataStream
  6. Bootstrap按钮的状态
  7. linux的arp指令
  8. linux切换至root权限,【linux】sudo su切换到root权限
  9. SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)
  10. poj 1823 Hotel 线段树,注意懒惰标记,不标记就会超时滴
  11. java乘法代码_java九九乘法表代码
  12. starops 云效运维 文档_云效手册专有云版.pdf
  13. python实现LU分解与LUP分解
  14. 推荐2个开源聊天服务器
  15. 分布式文件系统设计,该从哪些方面考虑?
  16. 桌面程序开发 —如何做icns文件
  17. Banner(轮播)
  18. 在MMClassification中使用Swin-Transformer开始一个分类任务
  19. 百词斩-扇贝测试评估
  20. 三年java现在还是菜的不行_你java开发几年还是那么菜是因为你没有做到这些

热门文章

  1. 讼 天水讼 乾上坎下
  2. 如何在H5页面上添加音乐播放
  3. sap清账使用反记账_SAP反记账功能祥解
  4. 干货 | 关于离岸银行开户(境外开户),看这一篇就够了
  5. USACO 2015 January Contest Bronze——奶牛的旅行路线
  6. signal信号详解
  7. 283页K8S实战指南,内容详实,代码齐全可复制!
  8. ffmpeg php 抠像_FFMPEG批量绿幕抠像BAT脚本实现
  9. 【Netty】九、Netty自定义协议
  10. 自媒体写好文案的技巧,这5个网站请收藏好!你想要的都在!