我正在使用Python C API開發我自己的Python代碼解釋器,如Python文檔中所述。我看了一下Python源代碼,並試圖執行在執行py文件時在標準解釋器中執行的相同步驟。這些步驟(的C API函數調用序列)基本上是:嵌入式Python - 在時間模塊中阻塞操作
PyRun_AnyFileExFlags()
PyRun_SimpleFileExFlags()
PyRun_FileExFlags()
PyArena_New()
PyParser_ASTFromFile()
run_mod()
PyAST_Compile()
PyEval_EvalCode()
PyEval_EvalCodeEx()
PyThreadState_GET()
PyFrame_New()
PyEval_EvalFrameEx()
在我的代碼的唯一區別是,我做手工的AST編譯,框架的創建,等等,然後我打電話PyEval_EvalFrame。
有了這個,我可以用我的程序執行一個任意的.py文件,就好像它是普通的Python解釋器一樣。當我的程序正在執行的代碼使用時間模塊時,我的問題就出現了:GIL中的所有時間模塊操作都被阻塞了!例如,如果Python代碼調用time.sleep(1),則該調用將被阻止並且不會執行。
顯然我做了一些錯誤,阻止GIL(因此阻止時間模塊),但我不知道如何糾正它。我的控制代碼中的最後一條語句是在PyEval_EvalFrameEx中,從這一點開始,我認爲所有東西都運行「就像在普通的Python解釋器中一樣」。
任何人都有類似的問題?我做錯了什麼,以便阻止時間模塊? 希望有人能幫助我...
感謝您的時間。最好的問候,
R.
我想你的睡眠是什麼阻止GIL。有什麼令人信服的理由來運作自制翻譯? – synthesizerpatel 2010-12-07 13:05:51