標題有,但這裏有一些闡述。假設主線程派生另一個線程,其中一些代碼被加載到python解釋,然後另一個線程被稱爲其執行通過相同蟒接口更多的代碼(通過PyImport或PyRun)。這種情況是否可行?兩個線程可以同時使用相同的嵌入式Python解釋器嗎?
回答
如果我跟着你所問的,然後是你可以做到這一點,但是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實現最好的。
訪問兩個線程是否確定,史詩?它確實看起來像你(最好......)*序列化*線程使用單個解釋器實例。在我看來,OP希望每個(C++)線程都有自己的Python解釋器實例,並且能夠並行運行,線程由C++完成,而不是Python完成。或者,我是否誤解了OP的意圖? –
@MikeRobinson我以爲他想要兩個線程共享同一個解釋器。 – mshildt
呀,而且,儘管Python的「線程」是「只是‘排序的’線程」(因爲,當然,Python是一個解釋......),我有點八九不離十想我會把我的穿入到Python代碼。我們知道Python正確地管理其*線程版本... –
- 1. 兩個線程可以使用相同的線程程序嗎?
- 2. 兩個線程可以同時訪問同步方法嗎?
- 3. 進程VS線程:兩個進程可以共享相同的共享內存嗎?可以兩個線程?
- 4. 多個線程可以加入相同的boost :: thread嗎?
- 5. 一個線程可以同時持有兩個鎖嗎?
- 6. 兩個線程可以寫入同一個數組的不同元素嗎?
- 7. Lua:我可以使用IO同時寫入兩個文件嗎?
- 8. 兩個應用程序可以訪問相同的Cookie嗎?
- 9. 我可以在多線程程序中嵌入多個Python解釋器副本嗎?
- 10. 可以在兩個Python程序寫入和讀取的同時
- 11. 多個線程可以同時將數據寫入文件嗎?
- 12. 兩個Android碎片可以使用相同的ID嗎?
- 13. 同時使用兩個線程訪問兩個同步塊
- 14. Python線程不能在C++應用程序嵌入式解釋器中運行
- 15. 任何人都可以解釋python的相對導入嗎?
- 16. 相同的python解釋器實例同時運行多個腳本?
- 17. 我可以從多個線程繪製到相同的CGContextRef嗎?
- 18. 兩個cpu機器上的兩個不同進程可以同時訪問相同的RAM地址
- 19. 兩個進程可以共享相同的類名嗎?
- 20. 可以兩個進程共享相同的GPU內存嗎? (CUDA)
- 21. Nodejs createDecipher,可以使用兩個不同的密鑰解密相同的密文
- 22. 爲什麼兩個ANLTR解析器不同地解釋相同的字符串?
- 23. 兩個不同的進程可以共享相同的DLL數據嗎?
- 24. 多個偵聽器可以使用相同的代碼嗎?
- 25. WPF:我可以同時對多個項目應用相同的樣式嗎?
- 26. 一個進程的不同線程可以使用更多的處理器嗎?
- 27. 有人可以解釋兩個Python命令的區別嗎?
- 28. 內核可以通過多線程同時處理兩個系統調用嗎?
- 29. Java:可以2個線程真正同時在一個對象上運行相同的非同步方法嗎?
- 30. 我可以同時在多個線程中使用Lucene.Net中的IndexSearcher相同實例嗎?
你想兩個線程共享相同的嵌入式解釋吧? – mshildt
@epicbrew是的,同樣的解釋,有相同的內存 – user3496846