Python高级——多线程_06_进程
进程
概念:一个运行的程序,简称是操作系统资源分配的基本单位
线程是CPU进行资源调度的基本单位
进程是操作系统进程资源分配的单位
轻量级进程 = 线程
进程开销大,线程稍小
cpu给每个进程分配的执行时间=时间片
进程状态:
就绪态:通过CPU的时间片进入运行态
运行态:执行等待需求的条件和变量进行等待态
等待态:等待满足条件的值后进入就绪状态
进程编号 identifed PID
创建:multiprocessing.Process
参数和线程一致
常用方法:
join(参数) 等待的秒数 无参默认等待执行完成
is_alive() 进程状态
terminate() 终止进程,有延时不能立刻查看结果
属性:
name 查看子进程的名称
pid:查看当前进程的pid(进程号)
start() 创建和启动子进程
查看当前进程状态
multiprocessing.current_process().is_alive()
os.getpid() 获取当前进程PID号
os.getppid() 获取当前进程的父进程的PID
命令行
ps -aux | grep python3 查看当前系统的所有进程
kill -9 PID号 强制退出
所有进程都有父进程,用于回收子进程的资源。所以删除了还会自动分配
进程间是独立数据空间-->多进程之间不共享全局变量
创建子进程其实是对主进程进行拷贝,进程之间相互独立,访问的全局变量不是同一个,所以进程之间不共享全局变量
进程间通信Queue
FIFO先进先出 队列
创建:multiprocessing.Queue(长度参数)
.put 放入数据 为满,阻塞队列等待空位
参数:data:存储数值 block:阻塞 timeout = None:等待时间
.get 取出数据 为空,阻塞队列等待有值
参数:block:阻塞 timeout = None:等待时间
.full 查看是否满 返回boole
.empty 查看是否为空 返回boole
.qsize 在有些系统中不支持,一般不用
判断是否为空时,可以掩饰或者长度判断是否及时加载完成
进程池间通信
不能使用multiprocessing.Queue
使用multiprocessing.Manager().Queue()
进程池
提前准备一批的进程以备用户的需求
优点:
1.提高用户体验-理解响应需求
2.重复使用进程完成任务,节约进 程的创建和释放的额资源开销
创建 multiprocessing.Pool(参数) 参数:进程池中进程的数量
添加任务 pool.apply(方法名)
apply在添加任务时,会等待任务添加完成才会继续向下执行,阻塞-同步
apply_async 在添加任务时,不会等待任务执行完 ,异步
关闭进程池 不允许再添加新任务 Pool.close()
等到进程池完成所有进程 Pool.join()
进程和线程的对比
区别:
1.进程不共享全局变量;线程共享,但需注意资源竞争的问题,解决办法:互斥锁或线程同步
2.创建进程的资源大,线程的小
3.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
4.线程不能独立执行,必须依存在进程中
5.多进程开发比单进程多线程开发稳定性要强
多进程:
优:可以用多核 缺:资源开销大
多线程:
优:资源开销小 缺:稳定性不如多进程高