day06课堂笔记
1. 进程
1.1 概念
线程- 轻量级进程
操作系统进行资源 调度 的基本单位
线程必须依附于进程而存在 不能独立存在
进程
是操作系统进行资源 分配 的基本单位
同一个进程内部的多个线程共享全局资源
一个运行程序默认一个进程-主进程, 一个进程中默认一个线程 - 主线程
1.2 验证系统中进程
PID 进程标识
ps -aux
ps process status
获取当前进程的PID
os.getpid()
获取当前进程的父进程的PID
os.getppid()
1.3 线程的创建和操作
创建
pro = multiprocessing.Process(target=入口, args=(), kwargs={})
pro.start()
阻塞等待子进程
pro.join() 一直等待 死等
pro.join(2) 阻塞等待子进程2秒 如果子进程没有终止那主进程就直接往下执行
终止子进程
pro.terminate()
判断子进程状态
pro.is_alive()
1.4 进程间通信
原因: 进程间不共享全局资源
Queue 是一种进程间通信的方式
是一种队列 先进先出
Queue使用
创建 队列对象 = multiprocessing.Queue(长度)
放 队列对象.put(数据)
取 数据 = 队列对象.get()
判断空 队列对象.empty()
判断满 队列对象.full()
数量 队列对象.qsize()
get方法的参数 get(block=True, timeout=None)
block表示是否阻塞等待
timeout超时-等待的时间 None表示一直等待
数据 = 队列对象.get() = .get(True) = .get(True,None)
.get(True, 10) 等待10s
.get(False) 不等待 = .get_nowait()
put方法的参数 put(data, block=True, timeout=None)
block表示是否阻塞等待
timeout超时-等待的时间 None表示一直等待
.put(100) = .put(100, True) = .put(100, True, None) 一直等待
.put(100, True, 10) 等待10s
.put(100, False) 不等待 = .put_nowait()
1.5 进程池
工作模式:
提前创建一批进程
重复利用已经空闲的进程执行 多任务
优点:
节约了 大量进程的创建/销毁的开销
提高任务的响应速度
添加任务的两种方式
同步方式
会阻塞等待添加任务的执行完成后才会继续往下执行
异步方式
只添加任务 不会等待任务执行完成
使用步骤:
1 创建进程池 进程池对象 = multiprocessing.Pool(工作进程的数量)
2 添加任务
同步 进程池对象.apply(入口) 添加任务并等待任务执行完成
异步 进程池对象.apply_async(入口) 只添加任务 不等待任务完成
3 关闭进程池
进程池对象.close() 不允许添加新任务
4 等待所有任务执行完成
进程池对象.join()
注意:
进程池之间的进程通信不能使用multiprocessing.Queue 而应该使用 multiprocessing.Manager().Queue
1.6 进程对比线程
进程 线程
分配 调度
不共享 共享
独立存在 依附于进程
可以用多核
系统提供原生的线程 可以使用多核CPU
CPython解释器产生的多线程 由于GIL问题 不能使用多核CPU
上一篇: SpringBoot面试个人总结
下一篇: 使用生成器创建新的迭代模式