Python进程、线程、协程

0x00 进程

0x01 线程

Python本身的设计对多线程的执行有所限制。在Python设计之初,为了数据安全所做的决定设置有GIL(Global Interpreter Lock,全局解释器锁)。
在Python中,一个线程的执行过程包括获取GIL、执行代码直到挂起和释放GIL。
例如,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作“通行证”,并且在一个Python进程中,只有一个GIL。拿不到通行证的线程就不允许进入CPU执行。
每次释放GIL锁,线程之间都会进行锁竞争,而切换线程会消耗资源。由于GIL锁的存在,Python中一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是在多核CPU上Python的多线程效率不高的原因。
由于GIL的存在,多线程是不是就没用了呢?
以网络爬虫来说,网络爬虫是IO密集型,多线程能够有效地提升效率,因为单线程下有IO操作会进行IO等待,所以会造成不必要的时间浪费,而开启多线程能在线程A等待时自动切换到线程B,可以不浪费CPU的资源,从而提升程序执行的效率。

0x02 协程

0x04 参考链接

posted @ 2022-05-03 23:32  dvlk1  阅读(14)  评论(0编辑  收藏  举报