4

受信したデータをクライアントにプッシュする、長時間実行される要求があります。ただし、リクエストには、クライアントが切断されるたびにクリーンアップしたいサーバー側で作成されたいくつかのリソースが必要です。ドキュメントを調べましたが、それがいつ発生したかを検出する方法が見つからないようです。何か案は?

4

1 に答える 1

3

CancelledErrorこれはドキュメントを見ても明らかではありませんが、ここで重要なのは、接続が閉じられたときにasyncio サーバーがハンドラー コルーチンに をスローすることです。CancelledError非同期操作が完了するのを待っている場所でキャッチできます。

これを使用して、次のようなものとの接続後にクリーンアップします。

async def passthrough_data_until_disconnect():
    await create_resources()
    while True:
        try:
            await get_next_data_item()
        except (concurrent.futures.CancelledError, 
                aiohttp.ClientDisconnectedError):
            # The request has been cancelled, due to a disconnect
            await do_cleanup()
            # Re-raise the cancellation error so the handler 
            # task gets cancelled for real
            raise
        else:
            await write_data_to_client_response()
于 2016-03-29T07:03:35.740 に答える