Я разрабатываю свой собственный интерпретатор кода Python с использованием API Python C, как описано в документации Python. Я взглянул на исходный код Python, и я попытался выполнить те же шаги, которые выполняются в стандартном интерпретаторе при выполнении файла py. Эти шаги (последовательность вызовов функций API C) в основном:Embedded 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()
Единственное различие в моем коде, что я делаю вручную АСТ сборник, рамки создания и т.д., а затем я называю PyEval_EvalFrame.
С этим я могу выполнить произвольный .py-файл с моей программой, как если бы это был обычный интерпретатор Python. Моя проблема возникает, когда код, который выполняет моя программа, использует модуль времени: все операции с модулем времени блокируются в GIL! Например, если код Python вызывает time.sleep (1), этот вызов блокируется и никогда не запускается.
Очевидно, что я делаю что-то неправильно, что блокирует GIL (и, следовательно, блокирует модуль времени), но я не знаю, как его исправить. Последнее утверждение в моем коде, где у меня есть элемент управления, находится в PyEval_EvalFrameEx, и с этого момента все работает «как в обычном интерпретаторе Python», я думаю.
У кого-нибудь была аналогичная проблема? Что я делаю неправильно, так что я блокирую модуль времени? Надеюсь, кто-то может мне помочь ...
Спасибо за ваше время. С уважением,
R.
Я предполагаю, что ваш сон - это то, что блокирует GIL. Любые убедительные причины для запуска переводчика-доморощенного? – synthesizerpatel