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