Ограничение времени выполнения встроенного 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».

     
    Interesting Posts for Van-Lav

    Пропустите очищенные URL от одного паука к другому

    Конкретный список перетасовки в Python

    Убить процесс python с pkill python

    matplotlib: значения смещения оси формата для целых чисел или определенного номера

    Как создать динамические переменные в Python?

    Добавить строку в файл, если она не существует с помощью python

    отправка запроса на мыло из python

    Как использовать ведение журнала с файловым файлом python и настроить имя файла журнала

    Учетные данные по умолчанию для App Engine перестали работать на локальном сервере dev

    Байтовый предел при передаче объектов Python между процессами с использованием Pipe?

    Показать строковые значения по оси x в pyqtgraph

    Сравнение двух списков с использованием оператора больше или меньше

    Осуществляется ли NLTK TF-IDF?

    Что такое регулярное выражение для удаления точек в аббревиатурах, но не в именах доменов?

    Путаница в области переменных Python

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