Я разрабатываю свой собственный интерпретатор кода 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.
Благодаря этому я могу выполнить произвольный файл .py с моей программой, как если бы это был обычный интерпретатор Python.Моя проблема возникает, когда код, который выполняет моя программа, использует модуль времени: все операции модуля времени блокируются в GIL!Например, если код Python вызывает time.sleep (1), этот вызов блокируется и никогда не выполняется.
Очевидно, я делаю что-то не так, что блокирует GIL (и, следовательно, блокирует модуль времени), но яне знаю, как это исправить.Последнее утверждение в моем коде, где у меня есть контроль, находится в PyEval_EvalFrameEx, и с этого момента все работает "как в обычном интерпретаторе Python", я думаю.
У кого-нибудь была подобная проблема?Что я делаю не так, чтобы я заблокировал модуль времени?Надеюсь, кто-нибудь может мне помочь ...
Спасибо за ваше время.С уважением,
R.