python的机制限制永远只有一个线程运行

如今的计算机都是多核多线程,允许并行运算,即使处理器单核也可以使用并发来提高运行效率。

比如在一个线程等待网络数据的同时,允许另一个线程占用CPU完成计算操作。并发编程对于程序运行加速是非常重要的。

python由于全局锁“GIL”的原因,在许多情况下一次只能运行 一个线程,只有特定的场景,才能运行运行多个线程。

所以大家得出结论 :python的线程是个假线程。

线程必须持有 GIL 才能调用 CPython C API。

在解释器中运行的 Python 代码,例如 x = g(3,4),会使用这些 API。 每个 == 比较、每个整数加法、每个 list.append:都进行一个调用 CPython C API。 因此,线程运行 Python 代码时必须持有锁。

其他线程无法获取 GIL,因此无法运行,直到当前运行的线程释放它,这会自动每 5ms 发生一次。

202268163552612.png

 

GIL 在 Python 3.7 到 3.10 中默认每 5ms 释放一次,从而允许其他线程运行:

>>> import sys
>>> sys.getswitchinterval()
0.005

长时间运行(“阻塞”)的扩展代码会阻止自动切换。

然而,用 C(或其他低级语言)编写的 Python 扩展可以显式释放 GIL,从而允许一个或多个线程与持有 GIL 的线程并行运行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值