zoukankan      html  css  js  c++  java
  • python中的gil是什么?

    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进入极度阻塞而缓慢的境地。

  • 相关阅读:
    Objective Evaluation Index of image
    MATLAB奔溃仅左上角显示关闭界面X
    论文修改指南之发表
    科研第一步:文献查找和下载
    实习项目1-串口IP升级调试
    FPGA驱动LCD显示红绿蓝彩条
    tw9912配置使用
    BT.656视频信号解码
    色彩空间转换 rgb转ycbcr422/ycbcr422转rgb
    xilinx VDMA IP核使用
  • 原文地址:https://www.cnblogs.com/tom-zhao/p/4809397.html
Copyright © 2011-2022 走看看