ホームページ >バックエンド開発 >Python チュートリアル >Python 3.5 の Async/Await で「ファイア アンド フォーゲット」動作を実現するにはどうすればよいですか?
「Fire and Forget」Python Async/Await
非同期プログラミングでは、待機せずに非クリティカルな操作を実行すると便利です。それらの完成。 Tornado では、コルーチンで yield キーワードを省略することで、この「ファイア アンド フォーゲット」動作を実現できます。ただし、Python 3.5 の async/await 構文では、このアプローチでは実行時警告が発生し、目的の操作が実行されません。
解決策: asyncio.Task
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() # Perform other actions if __name__ == '__main__': loop = asyncio.get_event_loop() loop.run_until_complete(main())
出力:
async_foo started Do some actions 1 async_foo done Do some actions 2 Do some actions 3
保留中のタスクの処理
イベント ループが完了した後もタスクが実行中の場合、警告が表示されることがあります。これを防ぐために、イベント ループが終了したらすべての保留中のタスクを待機することができます。
# Let's also finish all running tasks: pending = asyncio.Task.all_tasks() loop.run_until_complete(asyncio.gather(*pending))
タスクのキャンセル
場合によっては、タスクのキャンセルが必要になる場合があります。完了することが期待されていないもの。これは、task.cancel():
# Let's also cancel all running tasks: pending = asyncio.Task.all_tasks() for task in pending: task.cancel() # Now we should await task to execute it's cancellation. # Cancelled task raises asyncio.CancelledError that we can suppress: with suppress(asyncio.CancelledError): loop.run_until_complete(task)を使用して実現できます。
以上がPython 3.5 の Async/Await で「ファイア アンド フォーゲット」動作を実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。