Python Async/Await で「Fire and Forget」非同期操作を実装する方法

Barbara Streisand
リリース: 2024-11-09 01:08:02
オリジナル
269 人が閲覧しました

How to Implement

Python Async/Await の「Fire and Forget」

特定のシナリオでは、完了を待つ必要のない非同期操作を開始する必要があります。 。従来、Tornado のコルーチンの「ファイア アンド フォーゲット」アプローチは、yield キーワードを省略することで実現できました。

ただし、Python 3.5 の async/await 構文では、そのような実装では RuntimeWarning が発生し、コルーチンが

Asyncio.Task:解決策

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

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