Python のドキュメントで説明されているように、Python C API を使用して独自の Python コード インタープリターを開発しています。Python のソース コードを調べて、py ファイルを実行するときに標準のインタープリターで実行されるのと同じ手順を実行しようとしました。これらの手順 (C API 関数呼び出しのシーケンス) は、基本的に次のとおりです。
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 を呼び出すことです。
これにより、あたかも通常の Python インタープリターであるかのように、自分のプログラムで任意の .py ファイルを実行できます。私の問題は、私のプログラムが実行しているコードが時間モジュールを利用するときに発生します。すべての時間モジュール操作が GIL でブロックされます! たとえば、Python コードが time.sleep(1) を呼び出す場合、この呼び出しはブロックされ、実行されません。
明らかに、私はGILをブロックする(したがって時間モジュールをブロックする)何か間違ったことをしていますが、それを修正する方法がわかりません。私が制御できるコードの最後のステートメントは PyEval_EvalFrameEx にあり、その時点から、すべてが「通常の Python インタープリターのように」実行されると思います。
誰かが同様の問題を抱えていましたか?時間モジュールをブロックするために、私は何を間違っていますか? 誰かが私を助けてくれることを願っています...
御時間ありがとうございます。よろしくお願いします、
R.