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: localhost:55827 からのリクエストによる SystemExit:

それがなぜなのか、誰にも分かりますか?スレッドロックされたサブプロセス内にいますか? OSC lib/module では、システム プロセスがまだアクティブな間は発行できないようです。どんなアイデアでも素晴らしいでしょう...

ありがとう、jml

4

1 に答える 1

1

st スレッドを強制終了してから終了することでクリーンアップされるまで、フラグdone=Falseループを使用する別のアプローチを提案できますか。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()

このようなものは、もう少し好ましいものであり、リソースを適切にクリーンアップできます。

私たちが行っているのは、両方のグリーンレットが通信できる AsyncResult を作成することです。メインのグリーンレットは、その非同期結果のリッスンを終了する準備ができるまでループします。もう一方のグリーンレットには、logout_handle最終的に実行されるフックがあり、メインのグリーンレットに終了する時間であることを通知します。 .

于 2012-05-23T21:04:22.850 に答える