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

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

Patricia Arquette
リリース: 2024-11-09 01:38:02
オリジナル
949 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート