Системный вызов изнутри модуля lib lib
Я использую библиотеку OSC, найденную здесь. Я хотел бы программно выйти из программы через sys.exit(), когда получено конкретное сообщение.
я использую что-то вроде следующего:
oserve = OSC.OSCServer(('localhost', iportarg))
st = threading.Thread(target = oserve.serve_forever)
oserve.addMsgHandler("/logout", logout_handle)
def logout_handle(addr, tags, stuff, source):
sys.exit()
выдача сообщения '/logout' приводит к следующей ошибке:
OSCServer: SystemExit по запросу от localhost:55827:
Кто-нибудь есть идеи, почему это? я нахожусь в рамках подпроцесса, который был заблокирован потоком? похоже, что OSC / lib не позволяет мне выдавать системный процесс, пока он еще активен. любые идеи будут великолепны...
спасибо, jml
1 ответ
Могу ли я предложить альтернативный подход, используйте флаг done=False
цикл до done
является True
затем очистить, убив st поток и выход.
from gevent import spawn
from gevent.event import AsyncResult
is_done = AsyncResult()
oserve = OSC.OSCServer(('localhost', iportarg))
gl = gevent.spawn(oserve.oserve_forever)
oserve.addMsgHandler("/logout", logout_handle)
def logout_handle():
global is_done
is_done.set(True)
terminate_prog = False
while not terminate_prog:
if is_done.ready():
terminate_prog = True
st.kill()
sys.exit()
Нечто подобное немного предпочтительнее, и вы можете правильно очистить ресурсы.
Мы создаем AsyncResult, с которым могут взаимодействовать оба гринлета, основной гринлет зацикливается до тех пор, пока он не будет готов прекратить прослушивание этого асинхронного результата, у другого гринлета есть ловушка, где он выполняет logout_handle
в конце концов, который сигнализирует основному гринлету, пора уходить.