并发编程目的:程序提速
1. 分类
| 单线程串行 | 多线程并发(threading模块) | 多CPU并行(multiprocessing模块) |
|---|---|---|
![]() | ![]() | ![]() |
图中IO表示读取内存/磁盘、网络。
值得一提的是,单线程有一个特殊用法,协程(asyncio模块)。
二、难点
- 如何避免线程/进程之间的冲突(比如同时打开一个文件进行写入)——进程锁
- 如何实现线程/进程之间的数据通信——Queue
- 如何简化线程/进程的任务提交、等待结束、获取结果——Pool
- 如何与外部exe进程进行交互——subprocess
三、多线程Thread、多进程Process、多协程Coroutine
3.1 前置知识

3.2 三者对比
GIL全局解释器锁
| 多进程 | 多线程 | 多协程 | |
|---|---|---|---|
| 优点 | 同时利用多核CPU并行计算 | 相比进程,更轻量级、占用资源更少 | 内存开销少,可启动的协程数量最多 |
| 缺点 | 占用资源多、可启动数目比线程少 | 相比进程:只能并发执行,并由于GIL存在,无法利用多CPU 相比协程:启动数目有限制,占用内存资源,有线程切换开销 | 很多库不支持使用协程,如requests爬虫库需要用aiohttp库代替,代码实现复杂 |
| 适用 | CPU密集型计算 | IO密集型计算、同时运行的任务数目不多 | IO密集型计算、可以进行超多任务运行 |




235

被折叠的 条评论
为什么被折叠?



