特定のシナリオでは、完了を待つ必要のない非同期操作を開始する必要があります。 。従来、Tornado のコルーチンの「ファイア アンド フォーゲット」アプローチは、yield キーワードを省略することで実現できました。
ただし、Python 3.5 の async/await 構文では、そのような実装では RuntimeWarning が発生し、コルーチンが
幸いなことに、Python の asyncio ライブラリは、その asyncio.Task クラスを通じて解決策を提供します。これにより、メインの実行をブロックすることなく、バックグラウンドで実行できるタスクを作成できます。
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() # continue with other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
このアプローチにより、他のアクションは待機せずに続行できる一方で、async_foo() が非同期で実行されます。
イベント ループが完了すると、asyncio はすべてのタスクを期待することに注意することが重要です。終わってください。そのため、保留中のタスクが残っていると、警告が表示される可能性があります。これを防ぐには、すべての保留中のタスクを待つか、キャンセルします。
オプション 1: 保留中のタスクを待つ
pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
オプション 2: 保留中のキャンセルタスク
pending = asyncio.Task.all_tasks() for task in pending: task.cancel() with suppress(asyncio.CancelledError): loop.run_until_complete(task)
タスクをキャンセルすることで、これらはイベント ループのスケジュールから削除され、潜在的な警告が発生するのを防ぎます。
以上がPython Async/Await で「Fire and Forget」非同期操作を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。