Python并发编程的三种方式:多线程thread【threading模块】、多进程process【multiprocessing模块】、多协程coroutine【asyncio模块】。
一个进程可以有多个线程,一个线程可以有多个协程。其中线程、协程适用IO密集型场景,进程适用多CPU计算场景。
Python中多线程只能并发执行(单CPU调度权在线程间轮替切换);多进程是并行执行(利用多CPU的特性)。协程内存开销最少,可以同时开启上万个协程。
GIL
Global Interpreter Lock,全局解释器锁:依附进程,不同进程间【多CPU】GIL互相独立。某个进程的任一时刻最多只有一个线程在运行,其背后原理就是借助GIL锁实现的。
如图单进程内部,每个线程运行前提必须持有全局锁GIL,IO操作时释放全局锁GIL,由其他线程竞争获取。
Python相比静态语言Java/C++非常慢的原因:
- GIL锁的存在:无法利用多核CPU并行执行。
- 动态语言意味着边解释代码边执行。