2016-07-26 74 views
5

標題有,但這裏有一些闡述。假設主線程派生另一個線程,其中一些代碼被加載到python解釋,然後另一個線程被稱爲其執行通過相同蟒接口更多的代碼(通過PyImport或PyRun)。這種情況是否可行?兩個線程可以同時使用相同的嵌入式Python解釋器嗎?

+1

你想兩個線程共享相同的嵌入式解釋吧? – mshildt

+0

@epicbrew是的,同樣的解釋,有相同的內存 – user3496846

回答

2

如果我跟着你所問的,然後是你可以做到這一點,但是Python解釋器本身並不完全線程安全的。爲了解決這個問題,你必須確保每個線程在調用任何Python代碼之前獲得解釋器的GIL,然後再釋放它。即每一個線程需要做下面的執行時,Python代碼:

PyGILState_STATE gstate; 
gstate = PyGILState_Ensure(); 

// Do any needed Python API operations, execute python code 

// Release the GIL. No Python API allowed beyond this point. 
PyGILState_Release(gstate); 

你也應該開始Python解釋器,以確保線程後,請執行下列操作/ GIL正確初始化:

if (! PyEval_ThreadsInitialized()) { 
    PyEval_InitThreads(); 
} 

爲見Non Python Created Threads更多信息。

正如在評論中提到,這是值得注意的,這是真的只是順序訪問的解釋,但它是你可以做假設你使用CPython的Python實現最好的。

+0

訪問兩個線程是否確定,史詩?它確實看起來像你(最好......)*序列化*線程使用單個解釋器實例。在我看來,OP希望每個(C++)線程都有自己的Python解釋器實例,並且能夠並行運行,線程由C++完成,而不是Python完成。或者,我是否誤解了OP的意圖? –

+0

@MikeRobinson我以爲他想要兩個線程共享同一個解釋器。 – mshildt

+0

呀,而且,儘管Python的「線程」是「只是‘排序的’線程」(因爲,當然,Python是一個解釋......),我有點八九不離十想我會把我的穿入到Python代碼。我們知道Python正確地管理其*線程版本... –

相關問題