GIL在python的獲取和釋放
1、說明
執行緒對GIL的操作本質上就是透過修改locked狀態變數來獲取或釋放GIL。
2、獲取GIL例項
執行緒在其他執行緒已經獲取GIL的時候,需要透過pthread_cond_wait()等待獲取GIL的執行緒釋放GIL。
/*獲取GIL*/ int PyThread_acquire_lock(PyThread_type_lock lock, int waitflag) { int success; pthread_lock *thelock = (pthread_lock *)lock; int status, error = 0; status = pthread_mutex_lock( &thelock->mut ); /*先獲取mutex, 獲得操作locked變數的許可權*/ success = thelock->locked == 0; if ( !success && waitflag ) { /*已有執行緒上鎖,*/ while ( thelock->locked ) { /*透過pthread_cond_wait等待持有鎖的執行緒釋放鎖*/ status = pthread_cond_wait(&thelock->lock_released, &thelock->mut); } success = 1; } if (success) thelock->locked = 1; /*當前執行緒上鎖*/ status = pthread_mutex_unlock( &thelock->mut ); /*解鎖mutex, 讓其他執行緒有機會進入臨界區等待上鎖*/ if (error) success = 0; return success; }
3、釋放GIL例項
特別注意最後一步, 透過pthread_cond_signal()通知其他等待(pthread_cond_wait())釋放GIL的執行緒,讓這些執行緒可以獲取GIL。
/*釋放GIL*/ void PyThread_release_lock(PyThread_type_lock lock) { pthread_lock *thelock = (pthread_lock *)lock; int status, error = 0; status = pthread_mutex_lock( &thelock->mut ); /*透過mutex獲取操作locked變數的許可權*/ thelock->locked = 0; /*實際的釋放GIL的操作, 就是將locked置為0*/ status = pthread_mutex_unlock( &thelock->mut ); /*解鎖mutex*/ status = pthread_cond_signal( &thelock->lock_released ); /*這步非常關鍵, 通知其他執行緒當前執行緒已經釋放GIL*/ }
以上就是GIL在python獲取和釋放的方法,希望能對大家有所幫助。更多Python學習指路:
本文教程操作環境:windows7系統、Python 3.9.1,DELL G3電腦。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2830463/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 逐行分析AQS原始碼(3)——共享鎖的獲取與釋放AQS原始碼
- 全網最詳細的AbstractQueuedSynchronizer(AQS)原始碼剖析(二)資源的獲取和釋放AQS原始碼
- 詳解Python GILPython
- 你見過Python的GIL嗎Python
- Python GIL(Global Interpreter Lock)Python
- python GIL的使用及弊端處理Python
- 對 Python 中 GIL 的一點理解Python
- Gil全域性解釋鎖和執行緒互斥鎖的關係執行緒
- Python中如何切換GIL?Python
- python如何幫我在投資中獲取更高收益Python
- python字典獲取_查Python
- Python獲取星期幾Python
- TCP連結的建立和釋放TCP
- Python獲取當前日期和日期差計算Python
- python 爬蟲之獲取標題和連結Python爬蟲
- python 獲取時間的datetime庫Python
- qt 打包釋出 獲取dllQT
- Python的tkinter獲取元件屬性和設定元件屬性Python元件
- Python指令碼的常見引數獲取和處理方式Python指令碼
- Python - opencv-python 獲取影片尺寸PythonOpenCV
- Python獲取jsonp資料PythonJSON
- python如何只獲取日期Python
- C#獲取Windows10螢幕的縮放比例C#Windows
- 在 Fedora 中獲取最新的 Ansible 2.8
- python 呼叫 shell ,獲取返回值和返回資訊Python
- Python GIL(全域性直譯器鎖)Python
- Python多執行緒與GIL鎖Python執行緒
- python request 獲取cookies value值的方法PythonCookie
- python的queue佇列獲取資料Python佇列
- python kubernetes 獲取 pod 的 cpu 佔用率Python
- datatables 獲取 pageLength 和 pageStart,重新獲取table資料
- 在 JDBC 中獲取插入 IDJDBC
- 使用Python獲取DNS解析時間和響應時間PythonDNS
- 如何用Python讀取開放資料?Python
- JavaScript獲取滑鼠在元素中的座標JavaScript
- JavaScript獲取元素在陣列中的位置JavaScript陣列
- Python如何獲取request response bodyPython
- python中獲取如何Series值Python