持有GIL的线程什么时候释放GIL?

先说结论:如果未持有GIL的线程太久没有获取GIL,已经持有GIL的线程就会释放锁。

在ceval.c#1237行中可以看到:ceval->gil_drop_request 被标记时,会释放锁。

main_loop:

for (;;) {

...

if (_Py_atomic_load_relaxed(&ceval->gil_drop_request)) {  // 其他线程要求当前线程释放锁

/* Give another thread a chance */

if (_PyThreadState_Swap(&runtime->gilstate, NULL) != tstate) {

Py_FatalError("ceval: tstate mix-up");

}

drop_gil(ceval, tstate);   // 当前线程释放锁

/* Other threads may run now */

take_gil(ceval, tstate);   // 当前线程尝试再获取锁

...

}

eval->gil_drop_request 什么时候被标记呢?

看下面的代码可以得出结论:如果 未持有GIL的线程 超过了等待时间 且 GIL是锁住的状态 且 GIL的持有者没有变更过,就会标记 ceval->gil_drop_request变量。

static void take_gil(PyThreadState *tstate)

{

...

while (_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked)) {  // 只要 gil 是锁住的状态, 进入这个循环

int timed_out = 0;

unsigned long saved_switchnum;

saved_switchnum = _PyRuntime.ceval.gil.switch_number;   // 保存当前持有GIL的身份

// 释放 gil.mutex, 并在以下两种条件下唤醒

// 1. 等待 INTERVAL 微秒(默认 5000)

// 2. 还没有等待到 5000 微秒但是收到了 gil.cond 的信号

COND_TIMED_WAIT(_PyRuntime.ceval.gil.cond, _PyRuntime.ceval.gil.mutex,

INTERVAL, timed_out);

// 如果超过了等待时间 && GIL是锁住的状态 && GIL的持有者没有变更过

if (timed_out &&

_Py_atomic_load_relaxed(&_PyRuntime.ceval.gil.locked) &&

_PyRuntime.ceval.gil.switch_number == saved_switchnum) {

SET_GIL_DROP_REQUEST();  // 把 gil_drop_request 值设为 1, 持有GIL的线程看到这个值的时候, 会尝试释放GIL

}

}

...

}

所以,当未持有GIL的线程太久没有获取GIL了,就会设置一个全局变量。当前持有GIL的线程看到全局变量后,就知道自己要释放GIL。

cpython gil,CPython的线程与GIL相关推荐

  1. cpython gil_什么是GIL?为什么有了GIL还需要线程同步?为什么CPython设计了GIL?

    2019的暑假又准备用Python做个小项目,由于项目涉及高并发特性需要了解一下Python里的多线程与多进程,难免就会了解到CPython里的GIL(Global Interpreter Lock, ...

  2. python 线程, GIL 和 ctypes

    1 GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题, 运行下面这段 python 程序,CPU 占用率会到多少: [py ...

  3. 【python线程与GIL 锁】

    文章目录 消息队列 IPC 机制(进程间通信) 生产者消费者模型 生产者与消费者是什么模型 模型的三要素 通过代码来实现一下生产者消费者模型 什么是线程 线程实现TCP服务端开发 线程join方法 线 ...

  4. python线程和GIL

    GIL 与 Python 线程的纠葛 GIL 是什么?它对 python 程序会产生怎样的影响?我们先来看一个问题.运行下面这段 python 代码,CPU 占用率是多少? # 请勿在工作中模仿,危险 ...

  5. CPython GIL介绍 和 实现 及 GIL影响

    1.什么是CPython GIL ? GIL ,Global Interpreter Lock (全局解释器锁) ,CPython GIL 就是 Cpython解释器的全局解释锁. Cpython解释 ...

  6. python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...

    GIL锁 ​ 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...

  7. 10月13日学习内容整理:线程,创建线程(threading模块),守护线程,GIL(全局解释器互斥锁)...

    一.线程 1.概念:一条流水线的工作过程 2.和进程的区别和关系 (1)关系 >进程是资源单位,线程是执行单位,cpu真正执行的是线程 >一个进程至少有一个线程 >多线程针对的是一个 ...

  8. GIL、进/线程池、同/异步、阻/非阻塞

    1 GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的, 同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.GIL的优缺点: 优点: 保证Cpython解释器内存管理 ...

  9. GIL锁,线程锁(互斥锁)和递归锁

    GIL锁(Global Interpreter Lock):CPython才会有(是这种解释器的历史遗留问题),Python程序执行前,先获得GIL锁,然后每执行100个指令,解释器就自动释放GIL锁 ...

最新文章

  1. NYOJ 题目68 三点顺序
  2. AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer
  3. Mininet 系列实验(一)
  4. 电子商务应用课程知识整理 第四章-搜索引擎
  5. *【CodeForces - 122C 】Lucky Sum (bfs记录状态,二分查找,有坑)(或分块)
  6. Perl文档操作选项
  7. Node.js DNS 模块
  8. 【idea基础知识】常用快捷键整理
  9. 【iOS】TouchDown、TouchDownRepeat 和 TouchCancel 的区别
  10. 每天Leetcode 刷题 初级算法篇-设计问题-最小栈
  11. 【翻译】Fast Patch-based Style Transfer of Arbitrary Style
  12. 机器学习与Web安全结合的基础
  13. java 数据抓取 动态获得cookies里变动的属性_Java爬取CSDN博客遇到setCookie问题
  14. 什么是对象存储OSS,看完你就懂了
  15. php 批量 挂马,php下批量挂马和批量清马代码
  16. CF1438D Powerful Ksenia
  17. Android开发的单词本APP项目介绍及源码(大作业)
  18. TCP/IP协议中的端口
  19. strtotime那些事
  20. 笛卡尔心形函数表达式_笛卡尔心形曲线

热门文章

  1. 【PWN · ret2text | ‘/bin/sh‘写在bss段】[HNCTF 2022 Week1]ezr0p32
  2. 微信小程序开发--利用和风天气API实现天气预报小程序
  3. android找不到启动文件夹,NDK找不到应用程序目录
  4. 捡了鼠标开网吧系列——nodejs爬取电影链接
  5. ITIL02---蓝鲸平台介绍
  6. Git提交代码或文件
  7. Java中链表的使用
  8. 二手手机交易存个人信息安全隐患?旧手机到底该怎么样处理?
  9. 让你涨薪50%的思路分享 | 《巫师3》模型制作过程及思路
  10. centos卸载nvidia驱动_Linux下Nvidia显卡驱动卸载和卸载后的问题