參考:
……
#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 ...