流暢なPython-高度な記事-コルーチン非同期

asyncio

  • これは主にPythonでコルーチンを紹介し、研究の混乱を整理するためのものです。ソースコードではまだ検証されていませんが、私自身の意見の一部のみが記録されています。アイデアに矛盾がある場合は、次のことができます。一緒に話し合う

混乱している

  • 書く前に、誰もがいくつかのコルーチンの基本的な概念を大まかに知っている必要があると想定されています
  • まず、例を見てみましょう。この例の基本的なプロセスは、3つのタスクを作成して並行操作を実行することです。ここで、タスクはタスクであり、実行はタスクで時間のかかるシミュレーションです。
import asyncio

async def doing(name):
    print(f"{name} task doing ...")
    for i in range(100):
        # print(f"{name}-{i} doing ...")
        await asyncio.sleep(0.01)

async def task(name):
    print(f"{name} task start ...")
    await doing(name)
    print(f"{name} task stop ...")

def main():
    loop = asyncio.get_event_loop()
    tasks = [
        loop.create_task(task(name)) for name in range(3)
    ]
    loop.run_until_complete(asyncio.wait(tasks))

if __name__ == "__main__":
    main()
  • 結果
0 task start ...
0 task doing ...
1 task start ...
1 task doing ...
2 task start ...
2 task doing ...
0 task stop ...
1 task stop ...
2 task stop ...
  • インターネット上の多くの例では、asyncio.sleep(1)を使用して、タスク内の時間のかかるタスクをシミュレートしています。実際に時間のかかるタスクを自分で作成した人はいないようです。このドキュメントでは、asyncio.sleep(1)も強調されています。はコルーチンです。したがって、私の理解によれば、awaitの機能は、現在のタスクを一時停止し、CPUリソースを解放し、他のタスクにリソースを放棄することです。デフォルトの結果は次のようになります。
0 task start ...
1 task start ...
2 task start ...
···
  • しかし、結果は架空の結果ではありません。つまり、awaitは現在のタスクを一時停止し、実行の内容を実行します。その後、実験を行い、== print(f "{name}-{i} doing…"をキャンセルしました。 )==コメント、結果は次のとおりです。
···
0-57 doing ...
1-57 doing ...
2-57 doing ...
0-58 doing ...
1-58 doing ...
2-58 doing ...
···
  • この結果は、3つのタスクが同時に実験を行っていることを示しています。Set== await asyncio.sleep(0.01)==コメントを実行し、ループを3に設定すると、結果は次のようになります。
0 task doing ...
0-0 doing ...
0-1 doing ...
0-2 doing ...
0 task stop ...
1 task start ...
1 task doing ...
1-0 doing ...
1-1 doing ...
1-2 doing ...
1 task stop ...
2 task start ...
2 task doing ...
2-0 doing ...
2-1 doing ...
2-2 doing ...
2 task stop ...

完全に同期方式になっていることがわかり、以下の問題点を紹介します。

1. asyncio.sleep(1)とは正確には何ですか

  • まず第一に、睡眠は確かにコルーチンです。他のブログから、内部のタイマーであることがわかっています。非同期の時間のかかるタスクをシミュレートするための同期関数ではなく、==非同期関数==です。なぜコルーチンができないのですか。この関数を実行するには、まだ同期コードであるため、非同期クローラーを使用する場合と同じように、非同期操作を実行することはできません。実際、結果を確認した後も、同期する必要があります。 、リクエストは同期ライブラリであり、非同期操作をサポートしていないためです。aiohttpを使用して、真の非同期操作を実現できます。ここで、現象の本質を確認します。ソースコードを調べた後、ビジョンが本当にあるかどうかを分析します。正しい。
# 将doing 换成
async def call_on():
    status = requests.get('https://www.baidu.com')
    return status

2.awaitの役割は何ですか

  • 現在のコルーチンを一時停止します

おすすめ

転載: blog.csdn.net/DALAOS/article/details/114843400