Ограничение времени выполнения встроенного Python
если я вставляю интерпретатор Python в программу на C или C++, как в , есть ли способ ограничить время работы интерпретатора? Есть ли что-нибудь, чтобы остановить код на Python от входа в бесконечный цикл и предотвращая PyObject_CallObject
(или эквивалент) от возвращения?
аналогично, если код Python создает новый поток, есть ли что-нибудь, чтобы остановить этот поток от входа в бесконечный цикл и работает вечно?
2 ответов
Как вы можете видеть в документы, PyObject_CallObject
не имеет механизма ограничения продолжительности работы функции. Также нет функции API Python C, о которой я знаю, которая позволяет приостановить или убить поток, используемый интерпретатором.
поэтому мы должны быть немного более творческими в том, как мы останавливаем поток. Я могу придумать 3 способа, которыми вы могли бы это сделать (от самого безопасного/чистого до самого опасного...
опрос вашего основного приложения
идея вот это твоя функция Python, которая может работать в течение длительного времени просто вызывает другую функцию внутри основного приложения, используя API, чтобы увидеть, если она закрыта. Простой результат True / False позволит вам закончить изящно.
Это самое безопасное решение, но требует, чтобы вы изменили свой код Python.
использование исключений
поскольку вы внедряете интерпретатор, вы уже используете API C и поэтому можете использовать PyThreadState_SetAsyncExc чтобы заставить исключение быть поднятым в оскорбительном потоке. Вы можете найти пример, который использует этот API здесь. Хотя это код Python, та же функция будет работать из вашего основного приложения.
это решение немного менее безопасно, поскольку оно требует, чтобы код не поймал исключение и оставался в пригодном для использования состоянии после этого.
используйте ОС для завершения потока
Я не собираюсь вдаваться в это так как он по своей сути небезопасно. См.есть ли способ убить поток в Python? для некоторых объяснений почему.
Если вам нужно контролировать лаг и дрожание в некоторой системе реального времени, добавьте "StacklessPython" - Python с поддержкой совместных процедур. Используется в "Twisted Web Server".