Я внедряю интерпретатор Python в программу C. Однако может случиться так, что при запуске некоторого python script через PyRun_SimpleString()
будет работать в бесконечном цикле или выполнить слишком долго. Рассмотрим PyRun_SimpleString("while 1: pass");
Чтобы предотвратить блокировку основной программы, я думал, что могу запустить интерпретатор в потоке.
Как остановить выполнение python script во встроенном интерпретаторе, запущенном в потоке, не убивая весь процесс?
Можно ли передать исключение интерпретатору? Должен ли я обернуть script под какой-нибудь другой script, который будет слушать сигналы?
PS: я мог запускать python в отдельном процессе, но это не то, что я хочу - если это не последнее средство...
Update:
Итак, теперь это работает. Спасибо Денису Откидачу, еще раз!
Если я вижу это правильно, вам нужно сделать две вещи: попросите интерпретатора остановиться и return -1
в том же потоке, что и ваш PyRun_SimpleString().
Чтобы остановиться, у вас есть несколько возможностей: PyErr_SetString(PyExc_KeyboardInterrupt, "...")
или PyErr_SetInterrupt()
- первый из них может оставить Python еще несколько инструкций, а затем он остановится, а позже он немедленно прекратит выполнение.
В return -1
вы используете Py_AddPendingCall()
для ввода вызова функции в выполнение Python. Документы упоминают его с версии 2.7 и 3.1, но он работает и с более ранними Pythons (здесь 2.6). Начиная с версии 2.7 и 3.1 он также должен быть потокобезопасным, то есть вы можете назвать его, не приобретая GIL (?).
Итак, можно переписать следующий пример:
int quit() {
PyErr_SetInterrupt();
return -1;
}