溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言和Python中怎么線程混用

發(fā)布時間:2020-07-31 09:25:12 來源:億速云 閱讀:190 作者:小豬 欄目:開發(fā)技術

小編這次要給大家分享的是C語言和Python中怎么線程混用,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

問題

你有一個程序需要混合使用C、Python和線程, 有些線程是在C中創(chuàng)建的,超出了Python解釋器的控制范圍。 并且一些線程還使用了Python C API中的函數(shù)。

解決方案

如果你想將C、Python和線程混合在一起,你需要確保正確的初始化和管理Python的全局解釋器鎖(GIL)。 要想這樣做,可以將下列代碼放到你的C代碼中并確保它在任何線程被創(chuàng)建之前被調用。

#include <Python.h>
 ...
 if (!PyEval_ThreadsInitialized()) {
  PyEval_InitThreads();
 }
 ...

對于任何調用Python對象或Python C API的C代碼,確保你首先已經正確地獲取和釋放了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);
...

每次調用 PyGILState_Ensure() 都要相應的調用 PyGILState_Release() .

討論

在涉及到C和Python的高級程序中,很多事情一起做是很常見的—— 可能是對C、Python、C線程、Python線程的混合使用。 只要你確保解釋器被正確的初始化,并且涉及到解釋器的C代碼執(zhí)行了正確的GIL管理,應該沒什么問題。

要注意的是調用 PyGILState_Ensure() 并不會立刻搶占或中斷解釋器。 如果有其他代碼正在執(zhí)行,這個函數(shù)被中斷知道那個執(zhí)行代碼釋放掉GIL。 在內部,解釋器會執(zhí)行周期性的線程切換,因此如果其他線程在執(zhí)行, 調用者最終還是可以運行的(盡管可能要先等一會)。

看完這篇關于C語言和Python中怎么線程混用的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI