詳解C語言和Python中的線程混用
問題
你有一個(gè)程序需要混合使用C、Python和線程, 有些線程是在C中創(chuàng)建的,超出了Python解釋器的控制范圍。 并且一些線程還使用了Python C API中的函數(shù)。
解決方案
如果你想將C、Python和線程混合在一起,你需要確保正確的初始化和管理Python的全局解釋器鎖(GIL)。 要想這樣做,可以將下列代碼放到你的C代碼中并確保它在任何線程被創(chuàng)建之前被調(diào)用。
#include <Python.h> ... if (!PyEval_ThreadsInitialized()) { PyEval_InitThreads(); } ...
對于任何調(diào)用Python對象或Python C API的C代碼,確保你首先已經(jīng)正確地獲取和釋放了GIL。 這可以用 PyGILState_Ensure()
和 PyGILState_Release()
來做到,如下所示:
... /* Make sure we own the GIL */ PyGILState_STATE state = PyGILState_Ensure(); /* Use functions in the interpreter */ ... /* Restore previous GIL state and return */ PyGILState_Release(state); ...
每次調(diào)用 PyGILState_Ensure()
都要相應(yīng)的調(diào)用 PyGILState_Release()
.
討論
在涉及到C和Python的高級(jí)程序中,很多事情一起做是很常見的—— 可能是對C、Python、C線程、Python線程的混合使用。 只要你確保解釋器被正確的初始化,并且涉及到解釋器的C代碼執(zhí)行了正確的GIL管理,應(yīng)該沒什么問題。
要注意的是調(diào)用 PyGILState_Ensure()
并不會(huì)立刻搶占或中斷解釋器。 如果有其他代碼正在執(zhí)行,這個(gè)函數(shù)被中斷知道那個(gè)執(zhí)行代碼釋放掉GIL。 在內(nèi)部,解釋器會(huì)執(zhí)行周期性的線程切換,因此如果其他線程在執(zhí)行, 調(diào)用者最終還是可以運(yùn)行的(盡管可能要先等一會(huì))。
以上就是詳解C和Python中的線程混用的詳細(xì)內(nèi)容,更多關(guān)于C和Python 線程混用的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
VSCODE+cmake配置C++開發(fā)環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了VSCODE+cmake配置C++開發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼
本文主要介紹了QT實(shí)現(xiàn)將兩個(gè)時(shí)間相加的算法[hh:?mm?+?hh:?mm]的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C++調(diào)用迅雷接口解析XML下載功能(迅雷下載功能)
這篇文章主要介紹了C++調(diào)用迅雷接口,封裝解析XML下載的類,功能簡單,大家參考使用吧2013-11-11C語言用fun函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換方式
這篇文章主要介紹了C語言用fun函數(shù)實(shí)現(xiàn)兩個(gè)數(shù)的交換方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu) 堆排序的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2017-06-06