ホームページ >バックエンド開発 >Python チュートリアル >Python の Async/Await で「Fire and Forget」を本当に実現するにはどうすればよいですか?

Python の Async/Await で「Fire and Forget」を本当に実現するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-09 01:38:02925ブラウズ

How to Truly Achieve

Python の Async/Await による「ファイア アンド フォーゲット」

Python の async/await 構文では、待機せずに非同期関数を実行することはできません。望ましい「ファイアアンドフォーゲット」効果は得られません。代わりに、プログラムは実行時警告とともに終了します。

asyncio.「ファイア アンド フォーゲット」のタスク

asyncio で「ファイア アンド フォーゲット」を実装するには、asyncio を使用します。 「タスク」では、バックグラウンドで目的の操作を実行するタスクを作成します。 asyncio.ensure_future(async_foo()) を呼び出すと、async_foo() に関連付けられたタスクが開始され、その完了を待ちません。これは、明示的に待機する必要のない非同期操作に対するシンプルかつ効果的なアプローチです。

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()

保留中のタスクの完了

タスクは asyncio を使用して作成されることに注意してください。タスクはイベント ループが終了する前に完了することが期待されます。タスクが保留中の場合は、警告が生成されます。これを防ぐには、イベント ループが完了したら、すべての保留中のタスクを明示的に待機します。

async def main():
    asyncio.ensure_future(async_foo())  # Fire and forget async_foo()

    loop = asyncio.get_event_loop()
    await asyncio.gather(*asyncio.Task.all_tasks())

待機する代わりにタスクをキャンセルする

または、待機したくない場合は、特定のタスクを無期限に待機する場合は、キャンセルできます:

async def echo_forever():
    while True:
        print("Echo")
        await asyncio.sleep(1)


async def main():
    asyncio.ensure_future(echo_forever())  # Fire and forget echo_forever()

    loop = asyncio.get_event_loop()
    for task in asyncio.Task.all_tasks():
        task.cancel()
        with suppress(asyncio.CancelledError):
            await task

以上がPython の Async/Await で「Fire and Forget」を本当に実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。