Системный вызов изнутри модуля 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 в конце концов, который сигнализирует основному гринлету, пора уходить.

Другие вопросы по тегам