ホームページ >バックエンド開発 >Python チュートリアル >Python 3.5 の Async/Await で「ファイア アンド フォーゲット」動作を実現するにはどうすればよいですか?

Python 3.5 の Async/Await で「ファイア アンド フォーゲット」動作を実現するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-08 21:52:01540ブラウズ

How to Achieve

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

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