ルーチンがネストされる複数の asyncio コルーチンが必要な場合があります。コルーチン B はコルーチン A で実行され、C は B で実行されます。問題は、特定のループを停止することです。たとえば、ループ 'C' などの最後のトップ ループで loop.stop() を使用すると、このループ 'C' だけでなく、実際にはすべての asyncio コルーチンが強制終了されます。私は、stop() が実際にコルーチン A を強制終了し、そうすることで他のすべての依存ルーチンを消滅させているのではないかと考えています。ネストされたルーチンは call_soon_threadsafe であり、すべてのルーチンは run_forever として開始されます。
特定のループ名、または 'return' または 'break' (コルーチン内の while ループ内) を使用しようとしましたが、ループを終了するものは何もありません。
ここで説明した私の問題は、実際には私の以前の質問に関連してい ます... asyncio websocketコルーチンを使用したHTMLポップアップオーバーレイコールバック中にpythonデーモンサーバーがクラッシュします ...私は解決したと思っていました-このloop.stop()問題に遭遇するまで.
以下は Python 3.4.3 のコード例で、websocket ジョブが完了するとすぐに coroutine_overlay_websocket_server ループを停止しようとしています。前述のように、現在の状態での私のコードは、実行中のすべてのループを中断します。その後、fmDaemon は、以前に計算されたものを何も知らない新しい asyncio ループを再作成します。
import webbrowser
import websockets
import asyncio
class fmDaemon( Daemon):
# Daemon - see : http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
# Daemon - see : http://www.jejik.com/files/examples/daemon3x.py
def __init__( self, me):
self.me = me
def run( self):
while True:
@asyncio.coroutine
def coroutine_daemon_websocket_server( websocket, path):
msg = yield from websocket.recv()
if msg != None:
msg_out = "{}".format( msg)
yield from websocket.send( msg_out)
self.me = Function1( self.me, msg)
loop = asyncio.get_event_loop()
loop.run_until_complete( websockets.serve( coroutine_daemon_websocket_server, self.me.IP, self.me.PORT))
loop.run_forever()
def Function1( me, msg):
# doing some stuff :
# creating HTML file,
# loading HTML webpage with a webbrowser call,
# awaiting HTML button press signal via websocket protocol :
@asyncio.coroutine
def coroutine_overlay_websocket_server( websocket, path):
while True:
msg = yield from websocket.recv()
msg_out = "{}".format( msg)
yield from websocket.send( msg_out)
if msg == 'my_expected_string':
me.flags['myStr'] = msg
break
loop.call_soon_threadsafe( loop.stop)
loop = asyncio.get_event_loop()
loop.call_soon_threadsafe( asyncio.async, websockets.serve( coroutine_overlay_websocket_server, me.IP, me.PORT_overlay))
loop.run_forever()
loop.call_soon_threadsafe( loop.close)
# program should continue here...
私の 2 つの質問: 1) 下位のコルーチンを強制終了せずに特定のコルーチンを終了する方法はありますか? 2) または、代わりに、 asyncio を使用しない websocket 呼び出しを読み取る方法を知っていますか?