1.gil是什麼?python
在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作了什麼事情ui
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); }
代碼的實際的意思是:spa
每隔100個python指令,Python線程進行一個釋放GIL獲取GIL操做。線程
這是主要流程上的操做。咱們能夠看到一些其餘釋放GIL的代碼,並能夠追溯到這些函數code
PyEval_ReleaseLock ----> PyThreadState_DeleteCurrent
PyEval_ReleaseThread ----> None
PyEval_SaveThread ----> PyGILState_Releaseblog
而後在Python的源代碼上看許多釋放GIL的地方。好比_ctype,IO,multiprocess進程
經過查看_ctype的代碼能夠看到,不少釋放GIL 的操做,好比執行PythonObject。(這個PythonObject是C實現的)ip
不少IO,multiprocess操做。這也是顯而易見的。若是IO操做,讓寶貴的CPU進行等待IO 操做,任何線程不能執行代碼。多進程就不解釋了。ast
3.gil帶來什麼影響?
(1)在同一個時間只能運行一個Python線程。
(2)使用C lib,繞過GIL
(3)IO不會由於GIL進入極度阻塞而緩慢的境地。