0

ルーチンがネストされる複数の 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 呼び出しを読み取る方法を知っていますか?

4

1 に答える 1