詳解C語言和Python中的線程混用
問題
你有一個程序需要混合使用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() 都要相應的調(diào)用 PyGILState_Release() .
討論
在涉及到C和Python的高級程序中,很多事情一起做是很常見的—— 可能是對C、Python、C線程、Python線程的混合使用。 只要你確保解釋器被正確的初始化,并且涉及到解釋器的C代碼執(zhí)行了正確的GIL管理,應該沒什么問題。
要注意的是調(diào)用 PyGILState_Ensure() 并不會立刻搶占或中斷解釋器。 如果有其他代碼正在執(zhí)行,這個函數(shù)被中斷知道那個執(zhí)行代碼釋放掉GIL。 在內(nèi)部,解釋器會執(zhí)行周期性的線程切換,因此如果其他線程在執(zhí)行, 調(diào)用者最終還是可以運行的(盡管可能要先等一會)。
以上就是詳解C和Python中的線程混用的詳細內(nèi)容,更多關(guān)于C和Python 線程混用的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 如何用 Python 制作一個迷宮游戲2. vue組件庫的在線主題編輯器的實現(xiàn)思路3. 網(wǎng)頁中img圖片使用css實現(xiàn)等比例自動縮放不變形(代碼已測試)4. idea設(shè)置自動導入依賴的方法步驟5. 部署vue+Springboot前后端分離項目的步驟實現(xiàn)6. AspNetCore&MassTransit Courier實現(xiàn)分布式事務(wù)的詳細過程7. Django如何使用asyncio協(xié)程和ThreadPoolExecutor多線程8. Python安裝并操作redis實現(xiàn)流程詳解9. AJAX實現(xiàn)數(shù)據(jù)的增刪改查操作詳解【java后臺】10. JavaScript實現(xiàn)組件化和模塊化方法詳解
