Python の非同期プログラミングには、すぐに対応する必要のないタスクが含まれることがよくあります。このようなタスクを処理する 1 つのアプローチは、「ファイア アンド フォーゲット」パターンを使用することです。これにより、メインの実行フローをブロックすることなくタスクを同時に実行できます。
Tornado のコルーチン実装では、このパターンは yield キーワードを省略することで実現できます。ただし、Python 3.5 以降では、async/await 構文には別のアプローチが必要です。
asyncio.Task の Python ドキュメントによると、コルーチンは次のようになります。 asyncio.ensure_future を使用してタスクを作成することにより、「バックグラウンド」で実行されます。このタスクは、関数をブロックすることなく同時に実行されます。
import asyncio async def async_foo(): print("async_foo started") await asyncio.sleep(1) print("async_foo done") async def main(): asyncio.ensure_future(async_foo()) # fire and forget async_foo() # ... Other code can be executed here ...
デフォルトでは、asyncio はイベント ループが完了する前にタスクが完了することを期待します。イベント ループが完了した後もタスクが実行中の場合は、警告が発行されます。この警告を回避するには、イベント ループの完了後にすべての保留中のタスクを待機する必要があります。
loop = asyncio.get_event_loop() loop.run_until_complete(main()) # Wait for any remaining tasks pending = asyncio.Task.all_tasks() await asyncio.gather(*pending)
場合によっては、タスクを待機する代わりにキャンセルする必要がある場合があります。これは task.cancel() を使用して実行できますが、キャンセルされたタスクはキャンセルが完了するまで待つ必要があります。
# ... Same code as before ... # Cancel all running tasks pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): await asyncio.wait_for(task, timeout=None)
以上がPython の Async/Await を使用して「Fire and Forget」を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。