一篇文章带你深度解析Python线程和进程

谈谈python的GIL、多线程、多进程

2 02 3 年,一位最近学习Python的朋友问GIL、多线程、多处理之间的区别。

GIL,这是Python的全局解释器锁。
Python从一开始就是为了数据安全而设计的。
这可确保一次只有一个线程可以执行 Python 字节码,从而防止数据争用和不一致问题。

GIL 就像一条路径,确保线程安全。
然而,这也限制了多线程,特别是对于 CPU 密集型任务,因为线程之间的切换和 GIL 争用会消耗更多资源。

说到多线程,这对于 IO 密集型任务也很有用。
这是因为 IO 操作通常会阻塞一个线程,从而允许其他线程继续执行。

本文解释了多进程,它与线程不同。
创建多个进程,每个进程都有自己的内存空间和系统资源。
Python 允许真正的并行执行,因为每个进程都有自己的 GIL。

多处理的优点是可以充分利用多核CPU,但缺点是进程间的通信和同步比较复杂,创建和销毁进程也需要开销。

综上所述,如果想充分利用多核CPU资源,提高执行效率,建议使用多处理。
不过,多线程仍然适合IO密集型任务。

听到这话,朋友似乎明白了一些。
但现在想来,Python 中的并发编程还是有点复杂。
算了,你就会明白的。

为什么有人说 Python 的多线程是鸡肋

多线程确实有用,多处理也有多处理的优点。
多进程稳定,但启动成本较高。
公平地说,例如postgresql就使用多进程,Chrome也是多进程的。
如果你想创建一个像定时器这样简单的东西,对稳定性要求不高,比如类似VB或者C的定时器,那么就使用多线程,但是需要注意线程同步。
Python的线程更像是定时器,而不是真正的线程,但是在某些情况下使用这个定时器可以解决很多问题。
由于成本低,所以很容易开业。
进程和线程,一个重,一个轻。
重进程有保护区,进程上下文受操作系统保护,而线程则自行管理,需要一定的技巧,并不能保证并发时的稳定性。
几个进程也不稳定,但很容易看到,几个进程也很容易检测到。

真正的线程有上下文开销。
当操作系统启动多个进程和线程时,切换就会达到饱和,数量就会受到限制。
过多的线程或实际进程会导致 CPU 使用率过高,并且计时器可能会被激活尽可能多的次数。
在很多领域,一者并不比另一者先进,但存在着互补关系。
改变计算机计算单元有优点也有缺点。
关键是要找到合适的使用方法,扬长避短。