Python中如果是 I/O密集型的操作,用多线程(协程Asyncio、线程Threading),如果I/O操作很慢,需要很多任务/线程协同操作,用Asyncio,如果需要有限数量的任务/线程,那么使用多线程。
如果是CPU密集型操作,用多进程(multeprocessing)。
一、GIL
GIL(Global Interpreter Lock,即全局解释器锁),Python实质上并不存在真正的多线程,只有一个主线程在调度,由于GIL采用轮流运行线程的机制,GIL需要在线程之间不断轮流进行切换,线程如果较多或运行时间较长,切换带来的性能损失可能会超过单线程。
二、CPython引进GIL的主要原因是:
- 设计者为了规避类似内存管理这样的复杂竞争风险问题(race condition);
- CPython大量使用C语言库,但大部分C语言库都不是线程安全的(线程安全会降低性能和增加复杂度)。
三、绕过GIL的两种思路:
- 绕过CPython,使用JPython等别的实现;
- 把关键性能代码放到其他语言中实现,比如C++
四、线程、进程、协程
- 线程、进程——把内部资源、任务调度交给底层的CPU后者内核来处理。
- 协程 类似线程&#