python并发编程实战
python对并发编程的支持
- 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴的等待
- 多进程:multiprocessing,利用多核CPU的能力,真正的并行任务
- 一步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行
- 使用Lock对共享资源加锁,防止冲突访问。
- 使用Queue实现不同线程、进程之间的数据通信,实现生产者、消费者模式
- 使用线程池ThreadPoolExecutor、进程池ProcessPoolExecutor ,简化线程、进程的任务交互,等待结束,获取结果
- 使用subprocess启动外部程序的进程,并进行输入输出交互
python并发编程的三种方式
多线程Thread (threading)
优点:相比进程,更轻量级,占用资源少
缺点:
相比进程,多线程只能并发执行,不能利用多个CPU(GIL)
相比协程,启动数量有限制,占用内存资源,有线程切换的开销
多进程Process (multiprocessing)
优点:可以利用多核CPU并行运算
缺点:占用资源最多,可启动数目比线程少
适用于:IO密集型计算、需要超多任务运行、但是有现成库支持的场景
多协程Coroutine (asyncio)
优点:内存开销最少,启动协程数量最多缺点:支持的库有限制,(aiohttp vs requests),代码实现复杂
三者之间的关系:一个进程可以启动多个线程,一个线程可以启动多个协程
1. 什么是CPU密集型计算、IO密集型计算?
CPU密集型也叫计算密集型,是指IO在很短的时间内就可以完成,CPU需要大量的计算和处理,特点是CPU占用率相当高。例如:压缩解压缩,加密解密,正则表达式搜索
IO密集型指的是系统运作大部分的状况是CPU在等待I/O (磁盘、内存)的读写操作,CPU占用率仍然较低。例如:文件处理程序、网络爬虫程序、读写数据库程序
2. 多线程、多进程、多协程的对比
3. 怎样根据任务选择对应技术
异步IO库