私はクライアント/サーバアプリケーションを作成しています。接続されている間、クライアントはサーバに「ハートビート」信号、例えば毎秒を送信する。 サーバ側では、タスク(またはコルーチンなど)を非同期に実行するためのメカニズムが必要です。さらに、 "ハートビート"信号の送信を停止したときに、クライアントからタスクを取り消したい。asyncioでタスクをスケジュールしたりキャンセルするには
つまり、サーバーがタスクを開始するときには、タイムアウトの種類があるか、ttl(例:3秒)です。サーバーは "ハートビート"信号を受信すると、タスクが完了するかクライアントが切断されるまで(信号の送信を停止する)、さらに3秒間タイマーをリセットします。
ここではexampleからasyncioチュートリアルpymotw.comのタスクをキャンセルしています。しかしここでは、event_loopが開始される前にタスクがキャンセルされています。これは私にとっては適切ではありません。
import asyncio
async def task_func():
print('in task_func')
return 'the result'
event_loop = asyncio.get_event_loop()
try:
print('creating task')
task = event_loop.create_task(task_func())
print('canceling task')
task.cancel()
print('entering event loop')
event_loop.run_until_complete(task)
print('task: {!r}'.format(task))
except asyncio.CancelledError:
print('caught error from cancelled task')
else:
print('task result: {!r}'.format(task.result()))
finally:
event_loop.close()
あなたは非同期を行うためにセロリのようなものを使うことに嫌うのですか? –
@KeithBailey実際には、セロリが助けになるかもしれません。しかし、標準ライブラリの一部であるasyncioの解決策があれば、ずっと良いでしょう。 –
私はセロリでそれをやる方法を大まかに考えています。asyncioでは、あなたができるはずですそれはキュー型(asyncio 1とマルチプロセッシング1)を使用して行います。これにより、キューとコンシューマを定義し、キューからアイテムを削除できます。私はそれがあなたの仕事をやめさせるとは思わない。 –