Dispatcher in Python con Asyncio

May 08 2023
Cos'è la programmazione basata sugli eventi?
La programmazione basata su eventi è un paradigma di programmazione in cui il flusso di un programma è determinato da eventi che si verificano piuttosto che da una sequenza di istruzioni eseguite in ordine. Nella programmazione basata sugli eventi, il programma risponde agli eventi nel sistema o nell'ambiente piuttosto che eseguire una serie predeterminata di istruzioni.
Foto di Hitesh Choudhary su Unsplash

La programmazione basata su eventi è un paradigma di programmazione in cui il flusso di un programma è determinato da eventi che si verificano piuttosto che da una sequenza di istruzioni eseguite in ordine. Nella programmazione basata sugli eventi, il programma risponde agli eventi nel sistema o nell'ambiente piuttosto che eseguire una serie predeterminata di istruzioni.

Varie fonti, come l'input dell'utente, gli eventi di sistema, l'attività di rete o i timer, possono attivare gli eventi. Quando si verifica un evento, il programma può reagire ad esso eseguendo una o più funzioni o callback registrate per gestire quell'evento specifico. Ciò consente al programma di essere più flessibile e reattivo, poiché può reagire agli eventi nel momento in cui si verificano anziché attendere il completamento di una specifica sequenza di azioni.

La programmazione basata su eventi viene comunemente utilizzata nelle interfacce utente grafiche (GUI), in cui le azioni dell'utente come i clic del mouse o l'input da tastiera vengono trattate come eventi che attivano azioni o aggiornamenti nel programma. Viene utilizzato anche nello sviluppo Web, in cui le richieste HTTP o gli eventi del browser attivano l'esecuzione di codice lato server o lato client. Le architetture guidate dagli eventi stanno diventando sempre più comuni nei sistemi distribuiti, in cui i messaggi o gli eventi comunicano tra diversi servizi o componenti.

Spedizioniere

Nel contesto della programmazione basata su eventi, un dispatcher è un oggetto che riceve gli eventi e quindi li invia ai gestori di eventi appropriati. Il dispatcher è responsabile della gestione della registrazione e dell'annullamento della registrazione dei gestori di eventi e di garantire che gli eventi vengano consegnati ai gestori corretti.

In alcuni framework basati su eventi, il dispatcher è chiamato bus o ciclo di eventi. Il bus di eventi riceve e invia eventi da varie origini ai gestori di eventi appropriati. Il ciclo di eventi gestisce la pianificazione e l'esecuzione di coroutine e callback in risposta agli eventi.

Il dispatcher può anche eseguire altre attività, come il filtraggio e l'elaborazione degli eventi, prima che vengano inviati ai gestori di eventi. Ad esempio, un dispatcher potrebbe implementare un modello di pubblicazione-sottoscrizione, in cui gli eventi vengono filtrati e inviati solo ai gestori di eventi che si sono iscritti per riceverli.

Crea un Dispatcher in Python con Asyncio

Per creare un dispatcher usando asyncio in Python, puoi usare la asyncio.Queueclasse per creare una coda che può essere usata per passare i messaggi tra le coroutine. Ecco un esempio di una semplice implementazione del dispatcher. Crea un file dispatcher.pye inserisci il seguente codice:

import asyncio

async def producer(queue):
    for i in range(10):
        await asyncio.sleep(1)
        await queue.put(i)
    await queue.put(None)

async def consumer(queue):
    while True:
        item = await queue.get()
        if item is None:
            break
        print(f"Consumed: {item}")
        queue.task_done()

async def main():
    queue = asyncio.Queue()
    tasks = [
        asyncio.create_task(producer(queue)),
        asyncio.create_task(consumer(queue)),
    ]
    await asyncio.gather(*tasks)
    await queue.join()

asyncio.run(main())

Nella maincoroutine, creiamo un'istanza di asyncio.Queuee la passiamo sia alle coroutine producerche a consumer. Quindi creiamo attività per entrambe le coroutine usando asyncio.create_task()e le passiamo a asyncio.gather()per eseguirle contemporaneamente. Infine, chiamiamo queue.join()per attendere il completamento di tutte le attività.

Esegui il file con python3 dispatcher.py. Otterrai l'output seguente:

Il codice di questo articolo è disponibile qui su Github:

Conclusione

Il dispatcher svolge generalmente un ruolo fondamentale nella gestione degli eventi in un sistema basato sugli eventi. Garantisce che gli eventi vengano elaborati in modo efficiente e accurato e che i gestori di eventi siano correttamente registrati e non registrati secondo necessità.

Questo è tutto per questo articolo! Sentiti libero di lasciare feedback o domande nei commenti. Se hai trovato questa lettura entusiasmante, lascia qualche applauso e segui! Saluti!