py

楼主: sustainer123 (caster)   2024-09-30 22:54:12
全局锁(global interpreter lock,GIL)
讨论python的thread 我们就不得不提到GIL
这边必须先声明 GIL不是python的特性
这是cpython的产物
cpython是python的直译器
假如您想避开GIL 您可以考虑其他直译器 诸如jpython
但cpython是大多数情况的默认环境
所以大多数python使用者还是得面对GIL
GIL创立的目的是为了解决多线程的安全问题
这边要先介绍cpython的内存管理机制
cpython有一种管理方式叫引用记数
cpython的object的struct里面有个东西叫ob_refcnt
当你创建或引用变量时 ob_refcnt会+1
反之-1
当我们使用多线程时 线程会共用内存
这意味着线程会共用全局变量
当不同线程同时修改同个变量的引用记数
这就可能导致内存泄漏或内存提前被释放
总之 cpython考虑线程安全 才会引进GIL
GIL的具体运作方式
线程执行前 必须取得GIL 取得后才能开始执行任务
如果线程进入IO任务或执行超过一定时间(通常15毫秒)或执行完成
释放GIL
所以一个线程会经历三个步骤:
1.争取GIL
2.执行任务
3.释放GIL
因为只有一个GIL 所以一段时间内只会有一个线程运行
假设是多核心的情况 其他进程本来能在其他核心运行
因为GIL的缘故 其他核心只能在一旁闲置
所以python的多线程才会被说实际是单线程
从执行的效率来说 有GIL的多线程甚至不如单线程
因为每当GIL释放 系统需要执行线程切换
线程切换是保存线程的状态 并加载下一个执行的线程
再者 GIL释放时 线程会被唤醒竞争GIL
当GIL频繁被释出 上述行为重复执行
这耗费了大量的CPU资源
反观单线程就不需要执行上述行为
所以在CPU密集型任务 单线程优于多线程
PY:
import time
def countdown(n):
while (n > 0):
n = n - 1
start = time.time()
countdown(100000000)
end = time.time()
print('总时间:', end - start)
result:
总时间: 2.3528549671173096
py:
import time
import threading
def countdown(n):
while (n > 0):
n = n - 1
t1 = threading.Thread(target=countdown, args=(100000000/2,))
t2 = threading.Thread(target=countdown, args=(100000000/2,))
start = time.time()
t1.start()
t2.start()
t1.join()
t2.join()
end = time.time()
print('总时间:', end - start)
result:
总时间: 2.818242073059082
上述结果可以证明在cpu密集型任务 单线程优于多线程
先这样 后面应该会写gil争抢的可能问题 gil实际并没有线程安全
怎解决gil问题ㄅ
累了 剩下明天再写
参考资料:
https://wiki.python.org/moin/GlobalInterpreterLock
https://yhtechnote.com/global-interpreter-lock/
作者: handfox (handwolf)   2023-09-30 22:54:00
大师
楼主: sustainer123 (caster)   2024-09-30 22:55:00
好久不见 手狐你是112大老
作者: HGK (HGK)   2024-09-30 22:56:00
证明了 intel核心臭打游戏强
作者: Lilchicken (小鸡 )   2024-09-30 22:57:00
别打了 我脑子要炸了
作者: cities516 (安安路过)   2024-09-30 22:57:00
什么!
楼主: sustainer123 (caster)   2024-09-30 22:58:00
懒人包:python请用multiprocessing
作者: enmeitiryous (enmeitiryous)   2024-09-30 23:01:00
跟user level 和kernel level 的thread 的概念很像吗
作者: DJYOSHITAKA (Evans)   2024-09-30 23:09:00
大师
楼主: sustainer123 (caster)   2024-09-30 23:12:00
概念上我感觉类似 但具体上可能要再研究
作者: enmeitiryous (enmeitiryous)   2024-09-30 23:19:00
想起来了 多对一模式 多个使用者空间thread 其实对应同个kernel thread
楼主: sustainer123 (caster)   2024-09-30 23:22:00
大师 我os还没读完 研究中

Links booklink

Contact Us: admin [ a t ] ucptt.com