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

  • 相关阅读:
    Linux内存分析
    mysql 分表
    安装YCM
    c/c++ 之静态库
    ubuntu20 宽带连接
    数据对齐
    计算机中浮点数的表示
    整数的表示
    信息的储存
    SparseTable ST表
  • 原文地址:https://www.cnblogs.com/tom-zhao/p/4809397.html
Copyright © 2020-2023  润新知