Maison > développement back-end > Tutoriel Python > Événements et conditions Asyncio : la vie secrète des feux de circulation de Python

Événements et conditions Asyncio : la vie secrète des feux de circulation de Python

Susan Sarandon
Libérer: 2024-10-07 16:12:01
original
662 Les gens l'ont consulté

Asyncio Events and Conditions: The Secret Life of 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())


Copier après la connexion

Sortie :


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


Copier après la connexion

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())


Copier après la connexion

Sortie :


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


Copier après la connexion

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())


Copier après la connexion

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.


Copier après la connexion

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal