C 多執行緒中呼叫python api函式

2021-04-20 05:02:21 字數 1008 閱讀 5643

收藏今 天看了近一天關於多執行緒的應用中,如何安全呼叫python方面的資料,開始的時候看的簡直頭大如斗,被python語言的全域性鎖(global interpreter lock)、執行緒狀態(thread state )等都有點繞暈了,後來經過各方面文章和幫助文件的相互參考,發現對於2.4/2.5版本,提供了pygilstate_ensure, pygilstate_release,哎,這下可方便大發了。

一、首先定義乙個封裝類,主要是保證pygilstate_ensure, pygilstate_release配對使用,而且這個類是可以巢狀使用的。

#include

class pythreadstatelock

~pythreadstatelock(void)

private:

pygilstate_state state; };

二、在主線程中,這樣處理

// 初始化

py_initialize();

// 初始化執行緒支援

pyeval_initthreads();

// 啟動子執行緒前執行,為了釋放pyeval_initthreads獲得的全域性鎖,否則子執行緒可能無法獲取到全域性鎖。

pyeval_releasethread(pythreadstate_get());

// 其他的處理,如啟動子執行緒等

......

// 保證子執行緒呼叫都結束後

pygilstate_ensure();

py_finalize();

// 之後不能再呼叫任何python的api

三、在主線程,或者子執行緒中,呼叫python本身函式的都採用如下處理

呵呵,看這樣是否非常簡單了。

另 外還有兩個和全域性鎖有關的巨集,py_begin_allow_threads 和 py_end_allow_threads。這兩個巨集是為了在較長時間的c函式呼叫前,臨時釋放全域性鎖,完成後重新獲取全域性鎖,以避免阻塞其他 python的執行緒繼續執行。這兩個巨集可以這樣呼叫

C 多執行緒中呼叫函式的方法

在多執行緒中呼叫函式的方法 以函式名和函式引數作為輸入物件來構造執行緒物件 t2 t4 t6 t7 通過lambda表示式呼叫函式,將函式作為lambda表示式的內容 t1 t3 t5 include include include void printall int a,int b,int c v...

Qt多執行緒中呼叫QTimer

ifndef mythread h define mythread h include class qtimer class mythread public qthread endif mythread h 原始檔如下 include mythread.h include include mythr...

C 2005 多執行緒中呼叫窗體控制項

第一種方法 這種方法我沒用過,因為大家推薦不要使用,所以我沒去實驗過,具體方法如下 摘自網上 設定system.windows.forms.control.checkforillegalcrossthreadcalls false winform.下 如果在你的程式初始化的時候設定了這個屬性,而且在...