并发编程
2020-12-28 11:19:09 0 举报
AI智能生成
并发
作者其他创作
大纲/内容
三、并发编程之进程间通信、锁
僵尸进程
僵尸进程
子进程结束,没有被父进程回收的进程
有害的
占用内存资源,占用pid号
孤儿进程
父进程由于某种原因结束了,但是子进程还在运行中,
无害的
父进程结束,孤儿进程就会被init进程回收,init就变成了子进程的父进程,对其进程监控、回收
如何解决僵尸进程
杀死父进程,让他们变成孤儿进程有init进行回收
开启的子进程记得加join,join会回收僵尸进程
互斥锁
保证进程之间数据的共享,但是不能让他们乱来,要让他们一个一个的串行,所以互斥锁就是实现这个功能的工具
lock和join的区别
相同点
都可以把并发变成串行,保证顺序
不同点
join是认为的设定执行顺序,lock让其争抢执行顺序,保证了公平性
进程间的通信
基于文件通信
效率低
自己加锁麻烦且容易出现死锁
基于队列通信
最常用的
效率高
可控性良好
基于管道通信
生产者消费者模型
生产者消费者模式是通过一个容易来解决他们之间的强耦合性的关系
四、并发编程之线程
线程理论知识
什么是进程和线程
进程
进程是资源单位
在开启程序的时候,进程在内存空间加载空间
线程
线程是执行单位
线程去执行进程空间中的代码
进程VS线程
进程
开销大
开启速度慢
进程之间需要借助队列等方法进程通信
线程
线程之间数据可以共享
开销小
速度快
线程之间没有主次之分
主线程干完活,就是等待其他线程干完活之后,才能结束本进程
开启线程的两种方式
函数式
最常用
面向对象式
线程进程对比
速度
进程慢、线程快
pid
每开一个进程就有一个新的pid
线程共用一个pid,就是主线程的pid也就是这个进程的pid
数据共享
进程之间数据隔离
线程之间数据共享
线程的其他方法
getName()
获取线程名
activeCount
获取存活的线程数
join和守护线程
守护线程等待非守护子线程以及主线程结束之后,在结束。(如果守护线程的生命周期小于其他线程,那么它肯定先结束)
互斥锁
多个任务共抢一个数据,保证数据的安全
死锁现象与递归锁
死锁
多个进程或者线程抢资源而造成相互等待的一种现象。无外力的干扰将一直的阻塞下去
递归锁
解决死锁的现象
递归锁的数字为0才允许锁被抢,否则就不能抢
信号量
控制并发的数量
GIL全局解释器锁
在多进程的IO阻塞上能提高效率
GIL与lock的区别
相同点
都是相同的锁、互斥锁
不同点
GIL保活计时器内部数据资源的安全,GIL锁上锁和释放锁无需手动操作
GIL锁保护的是CPython解释器源码(库)的数据安全,而互斥锁保护的是我们py文件的自己写的程序的安全。
验证计算密集型和io密集型的效率
计算密集型
多进程的并发并行效率高
IO密集型
单个进程的多线程的并发效率高
多线程实现socket通信
在计算机允许的范围,开启的线程数量越多越好
进程池、线程池
以时间换空间
是先开启存放固定数量的线程的这么一个容器,然后给这个容器发布多个任务,让固定的数量的线程并发的处理多个任务
一、并发编程基础知识
进程的基础
什么是进程和程序
进程
正在运行的一个过程或者任务
程序
静态的代码
进程被谁运行
操作系统交由CPU运行
操作系统
什么是操作系统
是一个协调管理控制计算机硬件与软件关系的一个大软件
操作系统的作用
将复杂的丑陋的底层硬件的调用封装成简单的美丽的接口。
让程序对计算机硬件的竞争更加合理有序
并行和并发
什么是并行
多个CPU同时运行
什么是并发
伪并行,单个CPU+多道技术
多道技术
让CPU在多个进程之间来回切换程序
操作系统的发展史
第一代
第二代
磁带储存
第三代
集成电路
把硬件变小,产生线路板
多道技术
空间上的复用
把内存分区域,一个内存可以加在多个程序
时间上的复用
CPU在多个程序之间来回切换
第四代
现在计算机
多核
进程的理论
串行
所有的任务一个一个的完成
并发
一个CPU完成多个任务(在不同任务之间进行切换)。看起来像是同时完成
并行
多个CPU执行多个任务,真正的同时完成
阻塞
CPU遇到IO就是阻塞
非阻塞
没有遇到IO,程序一直运行
进程的创建
unix\linux
fork
windows
creatprocess
进程运行的状态
运行
阻塞
就绪
阻塞切换的时间
二、进程的创建
multiprocessing模块的接受
支持子进程、通信和数据共享、执行不同形式的同步
process类
子进程的创建
Queue
队列
pipe类
管道
锁
lock锁
进程对象的属性和方法
方法
start()
启动子进程并调用子进程中的run()方法
run()
自动运行,调用target参数自动的函数
terminate()
强制制止进程,不进行任何的清理
is_alive()
判断进程是否存活
jion([timeout])
子进程终止,且只能终止start()开启的进程
属性
deamon
默认值False,True设置为守护进程
name
进程的名字
pid
进程的pid
进程创建的两种方式
函数式
最常用的
面向对象式
进程pid
获取一个进程的pid
os.getpid()
获取父进程的pid
os.getppig()
验证进程之间的空间的隔离
子进程copy了主进程中的资源,另起炉灶
进程对象join()方法
join就是阻塞,主进程有join,主进程下面的代码一律不执行明知道主进程执行完毕再执行
守护进程
守护进程是子进程守护主进程,只要主进程结束了,子进程马上结束,无论子进程是否开始了,或者是否正在执行
守护进程内无法在开启子进程。否则抛出异常
与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限与该进程内
0 条评论
下一页