day34 并行并发、进程开启、僵尸及孤儿进程
day34 并行并发、进程开启、僵尸及孤儿进程
1、并行与并发
什么是并行?
并行指的是多个进程同时被执行,是真正意义上的同时
什么是并发?
并发指的是多个程序看上去被同时执行,这是因为cpu在多个程序之间不停的进行切换,且切换的速度十分快,让我们觉得自己在共享这段时间,所以不是真正意义上的同时
2、阻塞与非阻塞
阻塞:
当程序在执行过程中遇到了IO操作,此时进入阻塞状态
非阻塞:
当程序正常执行代码而没有遇到IO操作时,此时就是非阻塞状态
3、程序执行的三种状态
在程序执行过程中,程序不是一直在执行的,那么程序在什么时候进行切换呢?
CPU切换一般分为两种情况:
程序需要进行IO操作,程序进入阻塞状态,CPU切换执行其他程序
程序执行时间过长,其时间片消耗完,CPU 切换执行其他程序
程序在执行过程中是在三种状态之间不停的进行切换
这三种状态分别是:执行态、就绪态、阻塞态
程序在被CPU执行时,进入执行态,当程序进行IO操作时,CPU切换执行其他程序,此时程序进入阻塞态,当程序的IO操作完成后,CPU不会立马执行这个程序,而是程序进入就绪态,等待CPU的执行;当然CPU还有另一种切换的情况既程序执行时间过长,此时程序没有进入阻塞态,而是直接进入就绪态,等待被CPU 执行
4、开启进程的方法
进程的开启与关闭时由操作系统进行的,那么我们如何开启进程呢?
我们在开启进程时,实际上不是在开启进程,而是给系统发起一个指令,操作系统再根据我们的指令开启进程,所以有时我们在开启进程的过程中会发现,虽然发起了进程开启的指令,但是还是会一小段时间后才能开启成功
开启进程的两种方式:
直接将子进程执行的代码作为参数传入开启的子进程
from multiprocessing import Process
def test(name):
print("子进程开启")
print(name)
print("子进程结束")
if __name__ == "__main__":
print("父进程开启")
print(os.getpid())
p = Process(target=test,args=("lee",))
p.start()
print("父进程结束") # 执行结果
# 父进程开启
#
# 父进程结束
# 子进程开启
# lee
# 子进程结束
这种方式将需要执行的代码直接作为参数传递给子进程,除此之外,还有另一种方法可以将需要子进程执行的代码传递给子进程,那就是利用Process类将需要执行的代码直接写入到自己写的Process的子类中
在上面的代码中可以看到Process是一个类,那么我们就可以直接继承自Process类,重写其run方法就可以使子进程执行相应的程序
继承Process方法重写其run方法开启子进程
from multiprocessing import Process
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print("子进程开启")
print(self.name)
print("子进程结束")
if __name__ == "__main__":
print("父进程开启")
p = MyProcess(name="rose")
p.start()
print("父进程结束") # 执行结果
#父进程开启
# 父进程结束
# 子进程开启
# rose
# 子进程结束
5、在Windows及liunx中使用开启多进程的不同之处
在使用子进程执行程序时,子进程会首先copy父进程的部分数据,然后再将父进程的代码导入到子进程中,此时如果不将父进程放入if __name__ == __main__中就会出现递归导入,导致程序报错
但是在Linux中,开启的子进程会完全复制父进程的代码及记录运行状态,然后再进行执行,所以不会形成递归调用
当我们将程序交给子进程进行运行时,此时父进程与子进程之间的数据就是完全独立的两份,父进程的执行不会影响子进程中的变量,子进程的运行也不会影响父进程的变量
6、join方法
在使用父进程开启了子进程后,如果父进程的执行需要等到子进程的执行结果,那么就需要让父进程等待子进程的执行,但是当父进程执行较快时,子进程的执行还没有完成,父进程就会结束,此时需要让父进程等待子进程的执行,此时就需要使用join方法,join的作用就是提高子进程的优先级,使其执行完毕后才执行父进程
from multiprocessing import Process
def run(name):
print("子进程开启")
print(name)
print("子进程结束")
if __name__ == "__main__":
print("父进程开启")
p = Process(target=run,args=("lee",))
p.start()
p.join()
print("父进程结束") # 运行结果
# 父进程开始
# 子进程开始
# lee
# 子进程结束
# 父进程结束
7、多进程中的其它方法
name:进程的名字,在实例化进程对象时可以进行制定,如果不指定显示的是Process-编号的形式
is_alive():判断子进程是否仍存活
terminate():直接将子进程结束(杀死子进程)
pid:显示子进程的进程编号
8、pid与ppid
pid:进程编号,指的是当前进程的进程号
ppid:父进程编号,指的是当前进程的父进程的进程编号
9、僵尸进程与孤儿进程
僵尸进程:
当子进程执行结束而父进程还没有结束时,系统会将子进程的资源进行回收,但是由于父进程需要查询子进程的进程号等信息,所以不会将子进程的进程描述符清除,此时如果父进程不使用wait()或waitpid()查询子进程,那么子进程会一直存在,产生僵尸进程,如果僵尸进程过多,那么就会占用系统的pid号,影响其他程序使用,不过在python中会对僵尸进程进行处理,不需要我们手动进行处理
孤儿进程:
当父进程已经结束,而子进程还没有结束时,这时候子进程就称之为孤儿进程,孤儿进程会交给系统进行处理,孤儿进程没有危害
day34 并行并发、进程开启、僵尸及孤儿进程的更多相关文章
- 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程
1.进程 什么是进程: 一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统 2.多进程 多个正在运行的程序 在python中实现多线程的方法 from mult ...
- Go Exec 僵尸与孤儿进程
原文地址:Go Exec 僵尸与孤儿进程 最近,使用 golang 去管理本地应用的生命周期,期间有几个有趣的点,今天就一起看下. 场景一 我们来看看下面两个脚本会产生什么问题: 创建两个 shell ...
- linux系统编程之进程(三):进程复制fork,孤儿进程,僵尸进程
本节目标: 复制进程映像 fork系统调用 孤儿进程.僵尸进程 写时复制 一,进程复制(或产生) 使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文.进程堆栈. ...
- 并发编程(二)--利用Process类开启进程、僵尸进程、孤儿进程、守护进程、互斥锁、队列与管道
一.multiprocessing模块 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似. 2.mu ...
- 并发编程(二)——利用Process类开启进程、僵尸进程、孤儿进程、守护进程、互斥锁、队列与管道
Process类与开启进程.守护进程.互斥锁 一.multiprocessing模块 1.multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模 ...
- [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]
[并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...
- Python Web学习笔记之并发编程的孤儿进程与僵尸进程
1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊.今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上 ...
- 多进程wait、僵尸进程、孤儿进程、prctl
1.概念 1.孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,从而保证每个进程都会有一个父进程.而Init进程会自 ...
- [Linux] 孤儿进程与僵尸进程[总结]
转载: http://www.cnblogs.com/Anker/p/3271773.html 1.前言 之前在看<unix环境高级编程>第八章进程时候,提到孤儿进程和僵尸进程,一直对这两 ...
随机推荐
- jQuery 正则
正则 test 方法验证 var pattern = /^[A-Z]$/; //不需要引号 $('input[name="letter"]').blur(function(){ v ...
- Python面试题:使用栈处理括号匹配问题
括号匹配是栈应用的一个经典问题, 题目 判断一个文本中的括号是否闭合, 如: text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括 ...
- [Linux命令]curl命令参数详解——转载
linux curl是通过url语法在命令行下上传或下载文件的工具软件,它支持http,https,ftp,ftps,telnet等多种协议,常被用来抓取网页和监控Web服务器状态.curl命令参数介 ...
- spring boot打包以及centos下部署
spring boot打包以及部署 一.打包 springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成j ...
- css 能改变input type radio和checkbox 圆圈或方框的大小
把input隐藏,外面套label,再里面加个span,样式写在span上,让label覆盖在span上面,js去改active的class <label for="remember& ...
- Netfilter 之 钩子函数注册
通过注册流程代码的分析,能够明确钩子函数的注册流程,理解存储钩子函数的数据结构,如下图(点击图片可查看原图): 废话不多说,开始分析: nf_hook_ops是注册的钩子函数的核心结构,字段含义如下所 ...
- LeetCode 221. 最大正方形(Maximal Square)
题目描述 在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积. 示例: 输入: 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 输出: ...
- pm2 配置方式
1.命令生产默认示例配置文件pm2 ecosystem或pm2 init,运行默认会生成ecosystem.config.js配置文件 module.exports = { apps: [ { nam ...
- 基于eclipse的java与mysql开发环境的搭建
本文主要介绍 Java与MySQL的连接 1.安装jdk 略~ 园子里有很多 2.安装mysql 略~ 3.下载并安装JDBC,通过mysql官网下载 http://dev.mysql.com/d ...
- spring cloud之docker微服务客户端注册eureka问题
正常我们起一个微服务注册到eureka他的实例id是默认这样的主机名称:服务名称:服务端口号, 如果配置eureka.instance.prefer-ip-address=true则实例id为主机Ip ...