cpython gil,CPython的线程与GIL
持有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相关推荐
- cpython gil_什么是GIL?为什么有了GIL还需要线程同步?为什么CPython设计了GIL?
2019的暑假又准备用Python做个小项目,由于项目涉及高并发特性需要了解一下Python里的多线程与多进程,难免就会了解到CPython里的GIL(Global Interpreter Lock, ...
- python 线程, GIL 和 ctypes
1 GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程序会产生什么样的影响?我们先来看一个问题, 运行下面这段 python 程序,CPU 占用率会到多少: [py ...
- 【python线程与GIL 锁】
文章目录 消息队列 IPC 机制(进程间通信) 生产者消费者模型 生产者与消费者是什么模型 模型的三要素 通过代码来实现一下生产者消费者模型 什么是线程 线程实现TCP服务端开发 线程join方法 线 ...
- python线程和GIL
GIL 与 Python 线程的纠葛 GIL 是什么?它对 python 程序会产生怎样的影响?我们先来看一个问题.运行下面这段 python 代码,CPU 占用率是多少? # 请勿在工作中模仿,危险 ...
- CPython GIL介绍 和 实现 及 GIL影响
1.什么是CPython GIL ? GIL ,Global Interpreter Lock (全局解释器锁) ,CPython GIL 就是 Cpython解释器的全局解释锁. Cpython解释 ...
- python中gil锁和线程锁_Python线程——GIL锁、线程锁(互斥锁)、递归锁(RLock)...
GIL锁 计算机有4核,代表着同一时间,可以干4个任务.如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让看上去是并发的.但是单核永远肯定时串行的,它肯定是串行 ...
- 10月13日学习内容整理:线程,创建线程(threading模块),守护线程,GIL(全局解释器互斥锁)...
一.线程 1.概念:一条流水线的工作过程 2.和进程的区别和关系 (1)关系 >进程是资源单位,线程是执行单位,cpu真正执行的是线程 >一个进程至少有一个线程 >多线程针对的是一个 ...
- GIL、进/线程池、同/异步、阻/非阻塞
1 GIL:全局解释器锁 GIL本质就是一把互斥锁,是夹在解释器身上的, 同一个进程内的所有线程都需要先抢到GIL锁,才能执行解释器代码 2.GIL的优缺点: 优点: 保证Cpython解释器内存管理 ...
- GIL锁,线程锁(互斥锁)和递归锁
GIL锁(Global Interpreter Lock):CPython才会有(是这种解释器的历史遗留问题),Python程序执行前,先获得GIL锁,然后每执行100个指令,解释器就自动释放GIL锁 ...
最新文章
- NYOJ 题目68 三点顺序
- AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer
- Mininet 系列实验(一)
- 电子商务应用课程知识整理 第四章-搜索引擎
- *【CodeForces - 122C 】Lucky Sum (bfs记录状态,二分查找,有坑)(或分块)
- Perl文档操作选项
- Node.js DNS 模块
- 【idea基础知识】常用快捷键整理
- 【iOS】TouchDown、TouchDownRepeat 和 TouchCancel 的区别
- 每天Leetcode 刷题 初级算法篇-设计问题-最小栈
- 【翻译】Fast Patch-based Style Transfer of Arbitrary Style
- 机器学习与Web安全结合的基础
- java 数据抓取 动态获得cookies里变动的属性_Java爬取CSDN博客遇到setCookie问题
- 什么是对象存储OSS,看完你就懂了
- php 批量 挂马,php下批量挂马和批量清马代码
- CF1438D Powerful Ksenia
- Android开发的单词本APP项目介绍及源码(大作业)
- TCP/IP协议中的端口
- strtotime那些事
- 笛卡尔心形函数表达式_笛卡尔心形曲线
热门文章
- 【PWN · ret2text | ‘/bin/sh‘写在bss段】[HNCTF 2022 Week1]ezr0p32
- 微信小程序开发--利用和风天气API实现天气预报小程序
- android找不到启动文件夹,NDK找不到应用程序目录
- 捡了鼠标开网吧系列——nodejs爬取电影链接
- ITIL02---蓝鲸平台介绍
- Git提交代码或文件
- Java中链表的使用
- 二手手机交易存个人信息安全隐患?旧手机到底该怎么样处理?
- 让你涨薪50%的思路分享 | 《巫师3》模型制作过程及思路
- centos卸载nvidia驱动_Linux下Nvidia显卡驱动卸载和卸载后的问题