c單執行緒及多執行緒處理python

2021-10-24 09:20:20 字數 3447 閱讀 3860

參考:

……

#include ……

/*

其他初始化處理

pcrespjson 接收python函式返回值 如果有的話

*/const char *pcrespjson = null;

/* python 物件初始化 */

pyobject *pstname = null;

pyobject *pstmodule = null;

pyobject *pstfunc = null;

pyobject *pstar**s = null;

pyobject *pstretvalue = null;

/* python 初始化 */

py_initialize(); //初始化python環境

if ( !py_isinitialized() ) //檢測是否初始化成功

/* 下面處理 python */

pyrun_******string("import sys");

/* python 檔名稱 print_hello.py */

pstname = pyunicode_fromstring("print_hello");

pstmodule = pyimport_import(pstname);

py_decref(pstname);

if(pstmodule != null)

/* 函式 myprint 需要幾個引數,可以多個*/

pstar**s = pytuple_new(2);

pytuple_setitem(pstar**s, 0, py_buildvalue("s", 「name」));

pytuple_setitem(pstar**s, 1, py_buildvalue("s", "time"));

/* 呼叫 myprint 函式處理 */

pstretvalue = pyobject_callobject(pstfunc, pstar**s);

py_decref(pstar**s);

if(pstretvalue == null)

/* myprint 函式返回值轉碼處理 */

pcrespjson = pyunicode_asutf8(pstretvalue);

if(pcrespjson == null)

if(pcrespjson != null)

py_decref(pstretvalue);

py_decref(pstfunc);

py_decref(pstmodule);

}/* python 去初始化 */

py_finalize();

在專案中一定是只初始化一次,最後摧毀一次

建議不要反覆建立摧毀py模組

否則,會出現一些異常錯誤還有段錯誤。

編譯的時候帶上: -lpython3.7m

py_initialize(); // //誰初始化誰釋放原則,實際使用中需要存乙個值判定是否是自己初始化的

py_finalize();//摧毀好像會不完全摧毀,導致許多奇怪問題

多執行緒使用我不清楚,但是我在專案中一定是只初始化一次,最後摧毀一次

建議lz不要反覆建立摧毀py模組

void thread_init()

else

}

void thread_exit()

……

#include ……

/* pcrespjson 接收python函式返回值 */

const char *pcrespjson = null;

/* python 物件初始化 */

pyobject *pstname = null;

pyobject *pstmodule = null;

pyobject *pstfunc = null;

pyobject *pstar**s = null;

pyobject *pstretvalue = null;

/* 執行緒python 初始化 */

pygilstate_state gstate;

gstate = pygilstate_ensure(); //如果沒有gil,則申請獲取gil

py_begin_allow_threads;

py_block_threads;

/* 下面處理 python */

pyrun_******string("import sys");

/* python 檔名稱 print_hello.py */

pstname = pyunicode_fromstring("print_hello");

pstmodule = pyimport_import(pstname);

py_decref(pstname);

if(pstmodule != null)

/* 函式 myprint 需要幾個引數,可以多個*/

pstar**s = pytuple_new(2);

pytuple_setitem(pstar**s, 0, py_buildvalue("s", 「name」));

pytuple_setitem(pstar**s, 1, py_buildvalue("s", "time"));

/* 呼叫 myprint 函式處理 */

pstretvalue = pyobject_callobject(pstfunc, pstar**s);

py_decref(pstar**s);

if(pstretvalue == null)

/* myprint 函式返回值轉碼處理 */

pcrespjson = pyunicode_asutf8(pstretvalue);

if(pcrespjson == null)

if(pcrespjson != null)

py_decref(pstretvalue);

py_decref(pstfunc);

py_decref(pstmodule);

}/* 執行緒python 去初始化 */

py_unblock_threads;

py_end_allow_threads;

pygilstate_release(gstate); //釋放當前執行緒的gil

某個執行緒1加鎖處理任務時出錯了需要及時釋放鎖,否則另外乙個執行緒會卡死在取鎖的地方或者其他python處理的地方。

現象:**會卡在不同的地方

有的是呼叫python 前後幾行,或者python指令碼裡面不同的地方。

//異常情況處理釋放當前執行緒鎖gil

if (!nhold)

單執行緒 多執行緒

1.基於python的單執行緒示例 from time import ctime,sleep import time def play video video for i in range 2 print i am playing video s at s video,ctime sleep 5 d...

單執行緒和多執行緒

what 1.程序 當乙個程式開始執行時,它就是乙個程序,程序包括執行中的程式和程式所使用到的記憶體和系統資源。2.執行緒 執行緒就是程式中的乙個執行流,每個執行緒都有自己的專有暫存器 棧指標 程式計數器等 但 是可以共享的,即不同的執行緒可以執行相同的函式。3.多執行緒 多執行緒是指程式中包含多個...

單執行緒和多執行緒

普通的程式預設都是單執行緒,程式的執行方式是從上至下序列執行,示例 import time deffunc a,b time.sleep 1 print a b s time.time func 5,10 func 2,5 func 6,84 func 9,46 e time.time print ...