Python对并发编程的支持非常丰富,可以使用多线程、多进程、协程等方式进行并发编程。那么,应该如何选择呢?
Python并发编程有哪些方式
Python并发编程有三种方式:
- 多线程
Thread
- 多进程
Process
- 多协程
Coroutine
什么是CPU密集型计算、IO密集型计算?
CPU密集型(CPU-bound):
CPU密集型也叫计算密集型,是指I/O在很短的时间就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。
例如:
- 压缩解压缩
- 加解密
- 正则表达式搜索
IO密集型(I/O bound)
IO密集型指的是系统运作大部分的状态是CPU在等待IO的读写操作,CPU占用率依然较低。
例如:
- 文件处理程序
- 网络爬虫程序
- 读写数据库程序
多线程,多进程,多协程的对比
python并发编程有三种方式: 多线程Thread、多进程Process、多协程Coroutine。
多线程Process(multiprocessing)
优点:
- 相比进程,更轻量级,占用资源少
缺点:
- 相比进程:多线程只能并发执行,不能利用多CPU(GIL)
- 相比协程:启动书面有限制,占用内存资源,有线程切换开销
使用于:IO密集型计算、同时运行的任务数目要求不多。
多进程Thread(threading)
优点:
- 可以利用多核CPU并行运算
缺点:
- 占用资源最多、可以启动数目比线程少
使用于:CPU密集型计算
多协程Coroutine(asyncio)
优点:
- 内存开销最少。启动协程数目最多
缺点:
- 支持的库有限制(aiohttp VS requests)、代码实现复杂
适用于:IO密集型计算、需要超多任务运行、但有现成库支持的场景
怎样根据任务选择对应技术
- 如果是CPU密集型计算,使用多进程multiprocessing
- 如果是IO密集型计算,则考虑多线程或者多线程。
- 如果任务量大,有现成协程库支持,协程实现的复杂度可接受则首选协程,否则选线程。