0

我正在使用此处找到的 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/module 不允许我在系统进程仍处于活动状态时发出系统进程。任何想法都会很棒......

谢谢,jml

4

1 回答 1

1

我可以建议一种替代方法,使用标志done=False循环,然后通过杀死 st 线程然后退出来进行清理doneTrue

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是时候退出了.

于 2012-05-23T21:04:22.850 回答