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

Python の Async/Await を使用して「Fire and Forget」を実装するにはどうすればよいですか?

DDD
リリース: 2024-11-09 04:46:02
オリジナル
810 人が閲覧しました

How Can You Implement

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

はじめに

Python の非同期プログラミングには、すぐに対応する必要のないタスクが含まれることがよくあります。このようなタスクを処理する 1 つのアプローチは、「ファイア アンド フォーゲット」パターンを使用することです。これにより、メインの実行フローをブロックすることなくタスクを同時に実行できます。

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

Tornado のコルーチン実装では、このパターンは yield キーワードを省略することで実現できます。ただし、Python 3.5 以降では、async/await 構文には別のアプローチが必要です。

asyncio.Task から "Fire and Forget"

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

    # ... Other code can be executed here ...
ログイン後にコピー

保留中のタスクの処理

デフォルトでは、asyncio はイベント ループが完了する前にタスクが完了することを期待します。イベント ループが完了した後もタスクが実行中の場合は、警告が発行されます。この警告を回避するには、イベント ループの完了後にすべての保留中のタスクを待機する必要があります。

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

# Wait for any remaining tasks
pending = asyncio.Task.all_tasks()
await asyncio.gather(*pending)
ログイン後にコピー

タスクのキャンセル

場合によっては、タスクを待機する代わりにキャンセルする必要がある場合があります。これは task.cancel() を使用して実行できますが、キャンセルされたタスクはキャンセルが完了するまで待つ必要があります。

# ... Same code as before ...

# Cancel all running tasks
pending = asyncio.Task.all_tasks()
for task in pending:
    task.cancel()
    with suppress(asyncio.CancelledError):
        await asyncio.wait_for(task, timeout=None)
ログイン後にコピー

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

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