O que é Programação Assíncrona em Python
A programação assíncrona é uma forma de escrever código onde as tarefas não são executadas sequencialmente, mas sim de forma paralela ou aguardando eventos sem bloquear o fluxo principal de execução. Na programação moderna, o uso eficiente de recursos e tempo de execução das aplicações desempenha um papel fundamental.
A programação assíncrona permite:
- Acelerar a execução de tarefas
- Melhorar a responsividade dos programas
- Utilizar racionalmente os recursos do sistema
Principais Vantagens da Assincronicidade
Áreas de Aplicação
A programação assíncrona é especialmente útil para operações de entrada e saída:
- Trabalho com arquivos
- Requisições de rede (HTTP API)
- Interação com bancos de dados
- Processamento de web sockets
- Parsing de grandes volumes de dados
Diferenças do Multithreading
Ao contrário do multithreading, a assincronicidade não exige a criação de threads ou processos adicionais. Isso reduz a carga no sistema e evita problemas com bloqueios e sincronização de dados entre threads.
Como a Assincronicidade Funciona em Python
O Python oferece suporte nativo à programação assíncrona através do módulo asyncio, que foi oficialmente adicionado à biblioteca padrão a partir da versão 3.4.
Conceitos Fundamentais
async def— define uma função assíncrona (corrotina)await— indica que é necessário aguardar a execução de uma corrotinaasyncio— módulo padrão para trabalhar com tarefas assíncronasevent loop— loop de processamento de eventos que gerencia a execução das corrotinas
Exemplo Básico de Função Assíncrona
import asyncio
async def saudacao():
print("Olá!")
await asyncio.sleep(1)
print("Passou 1 segundo")
asyncio.run(saudacao())
Neste exemplo, await asyncio.sleep(1) simula a espera por uma operação que consome recursos, como uma requisição de rede.
Criação e Uso de Funções Assíncronas
Definição de uma Função Assíncrona
Para criar uma função assíncrona, use a palavra-chave async antes da definição da função:
async def buscar_dados():
print("Solicitando dados...")
await asyncio.sleep(2)
print("Dados recebidos")
Chamando uma Função Assíncrona
A chamada de uma função assíncrona é feita através de asyncio.run():
asyncio.run(buscar_dados())
Execução Paralela de Múltiplas Tarefas
Usando asyncio.gather()
Para executar várias corrotinas em paralelo, use asyncio.gather():
async def tarefa(nome, atraso):
print(f"Início da tarefa {nome}")
await asyncio.sleep(atraso)
print(f"Tarefa {nome} concluída")
async def main():
await asyncio.gather(
tarefa("A", 2),
tarefa("B", 1),
tarefa("C", 3)
)
asyncio.run(main())
Formas Alternativas de Executar Tarefas
Além de asyncio.gather(), você pode usar:
asyncio.create_task()— para criar tarefas individuaisasyncio.wait()— para aguardar a conclusão de tarefas com configurações adicionaisasyncio.as_completed()— para obter resultados à medida que ficam prontos
Iteradores e Geradores Assíncronos
Criando um Iterador Assíncrono
Para processar fluxos de dados de forma assíncrona, use iteradores assíncronos:
class ContadorAssincrono:
def __init__(self, max_contagem):
self.max_contagem = max_contagem
s