Я разрабатываю свой собственный интерпретатор кода Python с помощью API Python C, как описано в документации Python. Я смотрел на исходном коде Python, и я пытался выполнить те же шаги, которые выполняются в стандартном интерпретаторе при выполнении py файла. Эти шаги (последовательность вызовов API-функции C) в основном:
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.