Maison >développement back-end >Tutoriel Python >Événements et conditions Asyncio : la vie secrète des feux de circulation de Python
Vous êtes-vous déjà demandé comment vos coroutines Python parviennent à bien fonctionner ensemble sans provoquer d'embouteillages ? Plongeons dans le monde fantaisiste des événements et des conditions asyncio, ces héros méconnus qui empêchent votre code asynchrone de se transformer en cirque (sauf si vous le souhaitez).
Événements : le feu vert que tout le monde attend
Considérez un asyncio.Event comme un feu de signalisation dans votre code. Les coroutines font la queue et attendent patiemment (ou moins patiemment) que le feu passe au vert avant de s'éteindre.
Imaginez que vous êtes à un passage pour piétons avec un groupe de personnes (coroutines). Le signal piéton est rouge (l’événement n’est pas programmé), donc tout le monde attend. Au moment où il devient vert (event.set()), tout le groupe avance à l'unisson. Personne ne veut être cette personne qui évite les voitures parce qu’elles sont allées devant à un feu rouge.
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())
Sortie :
Pedestrian is waiting for the signal. Traffic light is red. Traffic light turns green. Pedestrian crosses the street.
Conditions : Le Pass VIP au Club
asyncio.La condition est comme ce videur du club exclusif. Non seulement vous avez besoin que le club soit ouvert (sous condition), mais vous devez également répondre à certains critères (wait condition.wait()).
Image en train d'essayer d'entrer dans une boîte de nuit branchée. Le club (condition) a une capacité limitée et le videur ne vous laisse entrer que si quelqu'un d'autre part (une condition est remplie). Vous pourriez attendre dehors, pratiquer vos meilleurs mouvements de danse (ou vérifier maladroitement votre téléphone), jusqu'à ce que vous obteniez le signe de la tête.
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())
Sortie :
Alice wants to enter the club. Bob wants to enter the club. Bouncer signals someone can enter. Alice enters the club.
Dans cet exemple, un seul clubber peut entrer dans le club car le videur ne signale qu'une seule personne (condition.notify()). L'autre clubber attend indéfiniment. Si vous voulez que tout le monde participe (à l'heure de la fête !), vous pouvez utiliser 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())
Sortie :
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.
Conclusion de la fête
À présent, vous devriez avoir une compréhension plus claire du fonctionnement des événements et des conditions asyncio. Ce sont les coordinateurs en coulisses qui veillent à ce que tout se passe bien.
Alors la prochaine fois que votre code asynchrone ne ressemble pas à un carambolage sur l'autoroute, vous saurez qui remercier !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!