我正在使用找到的here的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:来自localhost的请求SystemExit:55827:
有没有人知道为什么会这样?我在一个已被线程锁定的子进程中? 似乎OSC lib /模块不允许我在它仍处于活动状态时发出系统进程。 任何想法都会很棒......
感谢, JML
答案 0 :(得分: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()
这样的东西更适合imo,你可以正确地清理资源。
我们正在做的是制作一个可以与greenlet进行通信的AsyncResult,主要的greenlet循环直到它准备好退出侦听该异步结果,另一个greenlet有一个钩子,它最终执行logout_handle
向主要的greenlet发出信号,是时候退出了。