c程式多次呼叫python指令碼的正確開啟模式

2021-07-29 22:11:55 字數 1261 閱讀 3059

問題描述:c程式中需要多次呼叫python腳步;

初始做法:每次呼叫python指令碼時,開始初始化python環境(py_initialize),呼叫完之後結束python環境(py_finalize();)

問題:程式偶然會出現崩潰的現象;

c程式多次呼叫python指令碼的正確開啟模式如下:

1. 在主線程中這樣處理

// 初始化

py_initialize();

if ( !py_isinitialized() )

return

// 初始化執行緒支援

pyeval_initthreads();

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

pyeval_releasethread(pythreadstate_get());

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

......

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

pygilstate_ensure();

py_finalize();

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

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

pygilstate_state state;

state = pygilstate_ensure();

...// 呼叫python的api函式處理

...pygilstate_release(state);

注:

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

pygilstate_state state;

state = pygilstate_ensure();

// 呼叫python的api函式處理

......

py_begin_allow_threads

// 呼叫需要長時間的c函式

......

py_end_allow_threads

// 呼叫python的api函式處理

......

pygilstate_release(state);

防止程式多次執行(呼叫DLL)

region 防止程式多次執行 public abstract class oneinstance return ret dllimport kernel32.dll charset charset.auto private static extern intptr openmutex uint d...

Python呼叫C程式

目錄 python呼叫c程式的意義 呼叫示例 編寫c程式 編譯c程式 呼叫 我們知道,python具有編寫開發快 程式可讀性良好 支援物件導向的特點。種類繁多的python原生庫和第三方框架使python承擔越來越多的任務。但是python自身的缺陷也確實是python開發者要面對的問題 受制於動態...

C 防止標頭檔案多次呼叫

關於 pragma once簡單說明 若涉及多個檔案的編譯執行,如果把所有標頭檔案,原始檔都新增到當前工程下,並且每個標頭檔案都沒有加 pragma once,若在主函式include各個cpp,則會報錯,型別重定義 這樣理解,編譯的時候自動呼叫了一次,如果在主函式中再include一次,則相當於標...