文章目录
- 一、进程以及状态
- 二、[重点]进程-基本使用
- 三、[重点]进程-名称、PID
- 四、[重点]进程-参数传递、全局变量问题
- 五、[重点]进程-守护主进程
- 六、进程、线程对比
- 七、[重点]消息队列-基本操作
- 八、消息队列-常见判断
- 九、[重点]Queue实现进程间通信
- 十、[重点]进程池Pool
- 十一、进程池中的Queue
- 十二、案例:文件夹copy器(多进程版)
- 十三、[重点]可迭代对象及检测方法
- 十四、[重、难点]迭代器及其使用方法
一、进程以及状态
-
进程:资源分配的基本单位,也是线程的容器
-
进程的状态:
* 新建
* 就绪
* 运行
* 等待
* 死亡
二、[重点]进程-基本使用
-
进程使用的步骤:
-
导入模块
-
创建子进程对象
-
启动子进程
-
三、[重点]进程-名称、PID
-
获取进程的名称
-
获取进程的编号
-
获取进程的父id
-
结束进程
四、[重点]进程-参数传递、全局变量问题
-
进程的参数传递
-
args 元组
-
kwargs 字典
-
混合args 和 kwargs
-
-
进程间共享全局变量的问题
五、[重点]进程-守护主进程
-
进程守护: 子进程和主进程的一种约定,当主进程结束的时候,子进程也随之结束
-
结束子进程
六、进程、线程对比
- 进程和线程的对比
- 进程是资源分配的基本单位,线程是CPU调度的基本单位
- 进程运行需要独立的内存资源, 线程需要到的是必不可少的一点资源
- 进程切换慢,线程切换更快
- 线程不能独立运行,必须运行在进程中(进程能提供资源)
- CPU密集型 进程优先, I/O 密集型使用线程
- 程序更稳定进程,线程相比较不够稳定
- 不是非此即彼,而是组合使用
七、[重点]消息队列-基本操作
-
消息队列的学习的目的:为了实现进程间的通信
-
队列的创建:
- 导入模块 multiprocessing
- multiprocessing.Queue(5) # 队列长度为5
-
队列的操作:
-
放入值 queue.put(值) —>从队列尾部放入值
-
取值: queue.get() --> 从队列头部取值
-
xxxx_nowait() 方式
- 放入值 put_nowait() 特点:队列未满,同put() 但是队列已满,会报错,不等待
- 取值 get_nowait() 特点:队列未空,同get() 但是队列已空,会报错,不等待
-
八、消息队列-常见判断
- 常见的判断
- full() 判断是否已满
- empty() 判断是否为空
- 取出队列中消息的数量
- qsize()
九、[重点]Queue实现进程间通信
- 思路:利用队列在两个进程间进行传递,进而实现数据共享
- write_queue(queue)
- read_queue(queue)
- 创建一个空队列
- 把空队列作为参数,先把队列传递给写进程,然后把队列再传递给读进程
- join() 优先让一个进程先执行完成,另外一个进程才能启动
十、[重点]进程池Pool
-
进程池:是一个进程的容器,可以自动帮我们创建指定数量的进程,并且管理进程及工作
-
创建方法:
-
工作方式:
-
同步方式:
pool.apply(函数名,(参数1,参数2,…))
进程池中的进程,一个执行完毕后另外一个才能执行,多个进程执行有先后顺序
-
异步方式:
pool.apply_async(函数名,(参数1,参数2,…))
进程池中的进程,多个进程同时执行,没有先后顺序
1) 进程池要 close() 表示不再接受新的任务
2)还要join() 表示让主进程等待进程池执行结束后再退出
-
-
十一、进程池中的Queue
-
获取方法:
十二、案例:文件夹copy器(多进程版)
-
思路:
-
进程池拷贝文件
-
创建文件夹
-
获取文件夹中的内容
十三、[重点]可迭代对象及检测方法
-
可迭代对象
-
可迭代对象的检测:
十四、[重、难点]迭代器及其使用方法
-
迭代器的作用:
-
获取迭代器
-
获取可迭代对象的值
-
for循环的本质:
-
自定义迭代器类