Despachantes em Python com Asyncio

May 08 2023
O que é programação baseada em eventos?
A programação baseada em eventos é um paradigma de programação no qual o fluxo de um programa é determinado por eventos que ocorrem, e não por uma sequência de instruções executadas em ordem. Na programação baseada em eventos, o programa responde a eventos no sistema ou ambiente em vez de executar um conjunto predeterminado de instruções.
Foto de Hitesh Choudhary no Unsplash

A programação baseada em eventos é um paradigma de programação no qual o fluxo de um programa é determinado por eventos que ocorrem, e não por uma sequência de instruções executadas em ordem. Na programação baseada em eventos, o programa responde a eventos no sistema ou ambiente em vez de executar um conjunto predeterminado de instruções.

Várias fontes, como entrada do usuário, eventos do sistema, atividade da rede ou temporizadores, podem acionar eventos. Quando ocorre um evento, o programa pode reagir a ele executando uma ou mais funções ou callbacks registrados para lidar com aquele evento específico. Isso permite que o programa seja mais flexível e responsivo, pois pode reagir aos eventos à medida que eles ocorrem, em vez de esperar que uma sequência específica de ações seja concluída.

A programação baseada em eventos é comumente usada em interfaces gráficas de usuário (GUIs), onde as ações do usuário, como cliques do mouse ou entradas de teclado, são tratadas como eventos que acionam ações ou atualizações no programa. Também é usado no desenvolvimento da Web, onde solicitações HTTP ou eventos do navegador acionam a execução de código do lado do servidor ou do lado do cliente. Arquiteturas orientadas a eventos também estão se tornando mais comuns em sistemas distribuídos, onde mensagens ou eventos se comunicam entre diferentes serviços ou componentes.

Expedidor

No contexto da programação baseada em eventos, um despachante é um objeto que recebe eventos e os despacha para os manipuladores de eventos apropriados. O despachante é responsável por gerenciar o registro e cancelamento de registro de manipuladores de eventos e garantir que os eventos sejam entregues aos manipuladores corretos.

Em algumas estruturas orientadas a eventos, o despachante é chamado de barramento ou loop de eventos. O barramento de eventos recebe e despacha eventos de várias fontes para os manipuladores de eventos apropriados. O loop de eventos gerencia o agendamento e a execução de corrotinas e retornos de chamada em resposta a eventos.

O despachante também pode executar outras tarefas, como filtrar e processar eventos, antes de serem despachados para os manipuladores de eventos. Por exemplo, um dispatcher pode implementar um padrão de publicação-assinatura, em que os eventos são filtrados e despachados apenas para os manipuladores de eventos que se inscreveram para recebê-los.

Crie um Dispatcher em Python com Asyncio

Para criar um dispatcher usando asyncio em Python, você pode usar a asyncio.Queueclasse para criar uma fila que pode ser usada para passar mensagens entre corrotinas. Aqui está um exemplo de uma implementação de despachante simples. Crie um arquivo dispatcher.pye insira o seguinte código:

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

Na mainco-rotina, criamos uma instância de asyncio.Queuee a passamos para as co-rotinas producere consumer. Em seguida, criamos tarefas para ambas as corrotinas usando asyncio.create_task(), e as passamos asyncio.gather()para executá-las simultaneamente. Por fim, chamamos queue.join()para aguardar a conclusão de todas as tarefas.

Execute o arquivo com python3 dispatcher.py. Você obterá a saída abaixo:

O código deste artigo está disponível aqui no Github:

Conclusão

O despachante geralmente desempenha um papel crítico no gerenciamento de eventos em um sistema baseado em eventos. Ele garante que os eventos sejam processados ​​com eficiência e precisão e que os manipuladores de eventos sejam registrados e cancelados corretamente, conforme necessário.

É isso para este artigo! Sinta-se livre para deixar comentários ou perguntas nos comentários. Se você achou esta leitura empolgante, deixe algumas palmas e siga! Saúde!