Haben Sie sich jemals gefragt, wie Ihre Python-Coroutinen es schaffen, gut zusammenzuspielen, ohne einen Stau zu verursachen? Tauchen wir ein in die skurrile Welt der Asyncio-Ereignisse und -Bedingungen – die unbesungenen Helden, die verhindern, dass sich Ihr asynchroner Code in einen Zirkus verwandelt (es sei denn, Sie möchten es).
Ereignisse: Das grüne Licht, auf das alle warten
Stellen Sie sich ein asyncio.Event als eine Ampel in Ihrem Code vor. Coroutinen stellen sich auf und warten geduldig (oder nicht so geduldig), bis die Ampel grün wird, bevor sie losfahren.
Stellen Sie sich vor, Sie stehen mit einer Gruppe von Menschen (Koroutinen) an einem Zebrastreifen. Das Fußgängersignal ist rot (Ereignis ist nicht gesetzt), also warten alle. Sobald es grün wird (event.set()), bewegt sich die gesamte Gruppe gemeinsam vorwärts. Niemand möchte die Person sein, die Autos ausweicht, weil sie an einer roten Ampel vorausgefahren sind.
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())
Ausgabe:
Pedestrian is waiting for the signal. Traffic light is red. Traffic light turns green. Pedestrian crosses the street.
Bedingungen: Der VIP-Pass im Club
asyncio.Condition ist wie der Türsteher im exklusiven Club. Der Club muss nicht nur geöffnet sein (mit Bedingung), sondern Sie müssen auch bestimmte Kriterien erfüllen (awaitcondition.wait()).
Stellen Sie sich vor, wie Sie versuchen, in einen angesagten Nachtclub zu gelangen. Der Club (Bedingung) hat eine begrenzte Kapazität und der Türsteher lässt Sie nur dann hinein, wenn jemand anderes geht (eine Bedingung ist erfüllt). Sie könnten draußen warten und Ihre besten Tanzbewegungen üben (oder umständlich auf Ihr Telefon schauen), bis Sie das Nicken bekommen.
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())
Ausgabe:
Alice wants to enter the club. Bob wants to enter the club. Bouncer signals someone can enter. Alice enters the club.
In diesem Beispiel darf nur ein Clubbesucher den Club betreten, da der Türsteher nur eine Person signalisiert (condition.notify()). Der andere Clubber bleibt auf unbestimmte Zeit warten. Wenn Sie möchten, dass jeder reinkommt (Partyzeit!), können Sie condition.notify_all() verwenden.
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())
Ausgabe:
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.
Abschluss der Party
Inzwischen sollten Sie besser verstehen, wie asynchrone Ereignisse und Bedingungen funktionieren. Sie sind die Koordinatoren hinter den Kulissen und sorgen dafür, dass alles reibungslos läuft.
Wenn Ihr asynchroner Code also das nächste Mal nicht einer Massenkarambolage auf der Autobahn ähnelt, wissen Sie, wem Sie danken müssen!
Das obige ist der detaillierte Inhalt vonAsyncio-Ereignisse und -Bedingungen: Das geheime Leben der Verkehrssignale von Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!