进程、线程、协程
2021-02-23 10:13:17 23 举报
AI智能生成
登录查看完整内容
python相关
作者其他创作
大纲/内容
进程、线程、协程、锁
进程
定义及相关概念
在操作系统中运行的程序就是一个进程
是操作系统调度的
操作系统资源分配的最小单位
一个进程一个pid(今晨ID)
并发
多个程序同时在一个cpu上轮流执行
并行
多个程序同时在多个cup上执行
同步
在做事情A的时候,又来了一个事情B,必须等到事情B执行完成,才能继续做事情A
异步
在做事情A的时候,来了一个事情B,不需要等待事情B的结果,可以继续做事情A
阻塞
cpu不工作
非阻塞
cpu工作
进程的三状态图
就绪
运行
程序开始运行进入就绪队列——》等待被执行——》运行——》运行时间片到后——》就绪
当程序在正在运行——》遇到IO操作——》进入阻塞状态——》阻塞结束后——》进入就绪队列——》等待被运行
进程的调度算法
短作业优先
先来先服务
多级反馈算法
多个任务队列,优先级从高到低
新来的任务,优先级最高
每一个新来的任务都会立即获得一个时间片
执行完一个时间片后,会下降到下一级队列中
总是优先级高的任务执行完成后,在执行优先级低的任务
优先级越高时间片越短
进程模块multiprocessing
开启一个进程
join的用法
等待子进程执行完后,在执行主进程内的内容
基于进程实现socket的并发
server端
开启进程的另一种方式
继承Process类,并实现Process类的同名方法:run()
进程的其他方法
daemon = True 守护进程
定义
daemon = True 表示设置子进程是一个守护进程
结束进程 terminate
is_alive 查看进程是否存活,返回True或False
Manage 数据共享
线程
线程是进程中的一个单位,不能脱离进程单独存在
线程是操作系统(CPU)调度的最小单位
可以利用多核
线程之间数据共享
数据不安全
线程不能被强制关闭,没有terminate方法
全局解释器锁 GIL锁
同一个进程中的多个线程,同一时间只有一个线程被CPU调度
节省了IO操作的时间,而非CPU计算的时间
线程模块 Thread
线程的开启
面向对象开启一个线程
线程的其他方法
current_thread
print(current_thread().ident) #获取线程ID
enumerate
print('线程的对象列表:%s'%enumerate())
active_count
print('线程的对象列表数量:%s'%active_count())
守护线程
主线程会等待子线程结果而结束,是为了回收资源
守护线程会等待主线程(包括其他子线程)结束之后才结束
守护线程的结束原理,主进程结束之后,守护线程和其他所有线程资源一起被回收掉
线程的单例模式
线程锁
class A: from threading import Lock __instance = None lock = Lock() def __new__(cls): with cls.lock: if not cls.__instance: cls.__instance = super().__new__(cls) return cls.__instance
协程
协程就是一个线程
多个任务在一条线程上面来回切换
规避IO的两个模块
gevent
利用了 greenlet 底层模块完成的切换—自动规避io的功能
asyncio
利用了 yield 底层语法完成的切换—自动规避io的功能
区别
计算机资源分配最小单位,数据不安全,可以利用多核,操作系统级别,开销大
计算机(CPU)调度的最小单位,数据不安全,不能利用多核,操作系统级别,开销小
计算机(CPU)调度的最小单位,数据安全(GIL锁:全局解释器锁),数据安全,不能利用多核,用户级别,开销更小
操作系统相关
多道操作系统
优缺点
用户体验差
cpu使用率高
定义:
一个程序遇到IO操作就把cpu让给其他程序
分时操作系统
把时间分成很小的一段,每一段时间都是一个时间,每一个程序在一个时间片上运行片,当时间片到后,就轮到下一个程序执行自己的时间片
优缺点:
先来先服务FCFS
分布式操作系统
celery python分布式框架
同步、异步、阻塞相关概念
同步阻塞
调用一个函数,需要等待函数的执行结果,并且CPU不工作
同步非阻塞
调用一个函数,需要等待函数的执行结果,CPU工作
异步阻塞
调用一个函数,不需要等待函数的执行结果,CPU不工作
异步非阻塞
调用一个函数,不需要等待函数的执行结果,CPU工作
锁
进程锁
互斥锁
from multiprocessing import Lock
递归锁
from multiprocessing import Rlock
可以多次acquire
列子
抢票
优点
解决死锁有奇效
缺点
效率低
在同一线程中,可以被acquire多次
效率高
容易出现死锁
死锁的定义
-多把锁,在多线程中间交替使用
队列
进程队列
进程之间数据隔离
进程之间通信 IPC
是基于socket与pickle来实现的文件通信
先进先出
先进后出
优先级队列
生产者消费者模型
0 条评论
回复 删除
下一页