博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的gil是什么?
阅读量:6799 次
发布时间:2019-06-26

本文共 1417 字,大约阅读时间需要 4 分钟。

1.gil是什么?

在Python源代码:Python-2.7.10/Python/ceval.c。我看到的Python源代码版本为2.7.10

static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */

2.gil做了什么事情

if (--_Py_Ticker < 0) {            if (*next_instr == SETUP_FINALLY) {                /* Make the last opcode before                   a try: finally: block uninterruptible. */                goto fast_next_opcode;            }            _Py_Ticker = _Py_CheckInterval;            tstate->tick_counter++;            ....... /*for pending*/        }        if (interpreter_lock) {                /* Give another thread a chance */                if (PyThreadState_Swap(NULL) != tstate)                    Py_FatalError("ceval: tstate mix-up");                PyThread_release_lock(interpreter_lock);                /* Other threads may run now */                PyThread_acquire_lock(interpreter_lock, 1);        }

代码的实际的意思是:

每隔100个python指令,Python线程进行一个释放GIL获取GIL操作。

这是主要流程上的操作。我们可以看到一些其他释放GIL的代码,并可以追溯到这些函数

PyEval_ReleaseLock     ----> PyThreadState_DeleteCurrent

PyEval_ReleaseThread   ----> None
PyEval_SaveThread      ----> PyGILState_Release

然后在Python的源代码上看许多释放GIL的地方。比如_ctype,IO,multiprocess

通过查看_ctype的代码可以看到,很多释放GIL 的操作,比如执行PythonObject。(这个PythonObject是C实现的)

很多IO,multiprocess操作。这也是显而易见的。如果IO操作,让宝贵的CPU进行等待IO 操作,任何线程不能执行代码。多进程就不解释了。

3.gil带来什么影响?

(1)在同一个时间只能运行一个Python线程。

(2)使用C lib,绕过GIL

(3)IO不会因为GIL进入极度阻塞而缓慢的境地。

转载于:https://www.cnblogs.com/tom-zhao/p/4809397.html

你可能感兴趣的文章
转帖:深入理解JavaScript系列
查看>>
在Windows环境中使用版本管理工具Git(2)
查看>>
Android开发五 Android应用程序架构
查看>>
【发布】弹性分页类PagingBuild Class 附带测试
查看>>
<poj 1046>Color Me Less
查看>>
第k短路和A*
查看>>
Linux at命令定时发送邮件具体用法
查看>>
hudson无法访问问题,linux防火墙问题
查看>>
arcEngine 10 C++ 坐标转换【坐标系的投影】
查看>>
Java6 WebService学习
查看>>
命名规则 : 匈牙利法则
查看>>
适用于单选的jQuery Auto-complete插件SelectToAutocomplete
查看>>
chrome下可用的Windows Media Player插件
查看>>
ubuntu 10.04 install oracle11g
查看>>
我的Windows 8下看漫画程序差不多可以用了
查看>>
rabbitmq使用__python客户端(消息接收者)
查看>>
如何实现一套鼠标键盘控制二台主机
查看>>
html5 手机页面
查看>>
【Java学习笔记】Java中关于tostring方法的误操作
查看>>
Ubuntu 配置VNC以及使用VNC连接时,无法显示系统菜单栏,解决方法
查看>>