Ограничение времени выполнения встроенного Python

Если я внедряю интерпретатор Python в программу на C или C ++, как в этом примере , есть ли способ ограничить, как долго работает интерпретатор? Есть ли что-нибудь, чтобы остановить код Python от входа в бесконечный цикл и, таким образом, предотвратить PyObject_CallObject (или эквивалента)?

Точно так же, если код Python создает новый поток, есть ли что-нибудь, чтобы остановить этот поток от входа в бесконечный цикл и работать вечно?

    2 Solutions collect form web for “Ограничение времени выполнения встроенного Python”

    Как вы можете видеть в документах , PyObject_CallObject не имеет механизма ограничения времени выполнения функции. Также не существует функции API Python C, о которой я знаю, что позволяет приостановить или убить поток, используемый интерпретатором.

    Поэтому мы должны быть немного более креативными в том, как остановить поток. Я могу думать о 3 способах, которыми вы могли бы это сделать (от самого безопасного / чистого до самого опасного …

    Опрос основного приложения

    Идея здесь в том, что ваша функция Python, которая может работать в течение длительного времени, просто вызывает другую функцию внутри вашего основного приложения, используя API C, чтобы проверить, не следует ли ее закрывать. Простой результат True / False позволит вам прекратить изящество.

    Это самое безопасное решение, но требует, чтобы вы изменили свой код на Python.

    Использовать исключения

    Поскольку вы внедряете интерпретатор, вы уже используете API-интерфейс C и поэтому можете использовать PyThreadState_SetAsyncExc, чтобы заставить исключение подниматься в оскорбительном потоке. Вы можете найти пример, который использует этот API здесь . Хотя это код Python, одна и та же функция будет работать из вашего основного приложения.

    Это решение немного менее безопасно, так как оно требует, чтобы код не улавливал Исключение и впоследствии оставался в пригодном для использования состоянии.

    Используйте ОС для завершения потока

    Я не собираюсь входить в это, потому что это по своей сути небезопасно. См. Есть ли способ убить поток в Python? для некоторых объяснений почему.

    Если вам нужна контрольная лага и джиттер в некоторой системе реального времени, вставьте «StacklessPython» – Python с поддержкой совместных процедур. Используется в «Twisted Web Server».

    Python - лучший язык программирования в мире.