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