ホームページ > バックエンド開発 > Python チュートリアル > Asyncio のイベントと状況: Python の交通信号機の秘密の生活

Asyncio のイベントと状況: Python の交通信号機の秘密の生活

Susan Sarandon
リリース: 2024-10-07 16:12:01
オリジナル
662 人が閲覧しました

Asyncio Events and Conditions: The Secret Life of Python

Python コルーチンがどのようにして渋滞を引き起こすことなくうまく連携して動作するのか疑問に思ったことはありませんか? asyncio イベントと条件の気まぐれな世界に飛び込んでみましょう。非同期コードが (あなたが望まない限り) サーカスにならないように守ってくれる縁の下の力持ちです。

イベント: みんなが待っている青信号
asyncio.Event をコード内の信号機と考えてください。コルーチンは整列し、ズームオフする前にライトが緑色になるまで辛抱強く (またはそれほど忍耐強くなくても) 待ちます。

あなたが人々 (コルーチン) のグループと一緒に横断歩道にいると想像してください。歩行者用信号が赤(イベント未設定)なのでみんな待ちます。それが緑色に変わった瞬間 (event.set())、グループ全体が一斉に前進します。赤信号で進んだからといって車をよけるような人には誰もなりたくないものです。


import asyncio

async def pedestrian(event):
    print("Pedestrian is waiting for the signal.")
    await event.wait()
    print("Pedestrian crosses the street.")

async def traffic_light(event):
    print("Traffic light is red.")
    await asyncio.sleep(2)
    event.set()
    print("Traffic light turns green.")

async def main():
    event = asyncio.Event()
    await asyncio.gather(pedestrian(event), traffic_light(event))

asyncio.run(main())


ログイン後にコピー

出力:


Pedestrian is waiting for the signal.
Traffic light is red.
Traffic light turns green.
Pedestrian crosses the street.


ログイン後にコピー

条件: クラブの VIP パス
asyncio.Conditionは高級クラブの用心棒のようなものです。クラブが (条件付きで) オープンしている必要があるだけでなく、特定の基準 (awaitcondition.wait()) を満たす必要もあります。

トレンディーなナイトクラブに入ろうとしている写真。クラブ (条件) の収容人数は限られており、用心棒は他の人が退出した場合 (条件が満たされた場合) にのみ入場を許可します。うなずいてもらえるまで、外で最高のダンスの練習をしたり(またはぎこちなく携帯をチェックしたり)待つかもしれません。


import asyncio

async def clubber(condition, name):
    async with condition:
        print(f"{name} wants to enter the club.")
        await condition.wait()
        print(f"{name} enters the club.")

async def bouncer(condition):
    await asyncio.sleep(2)
    async with condition:
        print("Bouncer signals someone can enter.")
        condition.notify()

async def main():
    condition = asyncio.Condition()
    await asyncio.gather(
        clubber(condition, "Alice"),
        clubber(condition, "Bob"),
        bouncer(condition)
    )

asyncio.run(main())


ログイン後にコピー

出力:


Alice wants to enter the club.
Bob wants to enter the club.
Bouncer signals someone can enter.
Alice enters the club.


ログイン後にコピー

この例では、用心棒は 1 人に信号を送るだけであるため (condition.notify())、クラバーは 1 人だけがクラブに入場できます。もう一人のクラバーはいつまでも待ち続けています。全員に参加してもらいたい場合 (パーティータイム!)、condition.notify_all() を使用できます。


import asyncio

async def clubber(condition, name):
    async with condition:
        print(f"{name} wants to enter the club.")
        await condition.wait()
        print(f"{name} enters the club.")

async def bouncer(condition):
    await asyncio.sleep(2)
    async with condition:
        print("Bouncer signals everyone can enter.")
        condition.notify_all()

async def main():
    condition = asyncio.Condition()
    await asyncio.gather(
        clubber(condition, "Alice"),
        clubber(condition, "Bob"),
        bouncer(condition)
    )

asyncio.run(main())


ログイン後にコピー

出力:


Alice wants to enter the club.
Bob wants to enter the club.
Bouncer signals everyone can enter.
Alice enters the club.
Bob enters the club.


ログイン後にコピー

パーティーのまとめ
ここまでで、asyncio イベント条件 がどのように機能するかをより明確に理解できるはずです。彼らは、すべてがスムーズに進むよう裏方のコーディネーターです。

次回、あなたの非同期コードが高速道路の玉突き事故に似ていないときは、誰に感謝すればよいかわかります!

以上がAsyncio のイベントと状況: Python の交通信号機の秘密の生活の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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