Streams no asyncio: Reader, Writer e TCP resolve um problema recorrente em projetos Python: Leia e escreva protocolos TCP assíncronos com APIs de alto nível e limites explícitos. Este guia mostra o mecanismo, um exemplo executável e os limites que evitam uma implementação frágil.

Conceito e caso de uso

open_connection devolve reader e writer. O reader oferece leitura por linha ou tamanho; o writer bufferiza saída e drain aplica controle de fluxo.

Para revisar os fundamentos relacionados, consulte também o guia de async e await. A integração fica mais simples quando cada função recebe dependências e dados explicitamente, em vez de depender de estado global.

Exemplo prático

import asyncio

async def fetch(host: str, port: int) -> bytes:
    reader, writer = await asyncio.open_connection(host, port)
    try:
        writer.write(b"PING\n")
        await writer.drain()
        return await reader.readline()
    finally:
        writer.close()
        await writer.wait_closed()

Defina framing do protocolo, limite mensagens e envolva conexão e leituras em timeouts. Sempre feche e aguarde wait_closed.

Decisões importantes

A escolha correta depende do contrato público, do volume e do comportamento em caso de falha.

Considere como a solução se comporta sob concorrência, entradas vazias e falhas parciais. Documente qualquer limite que afete consumidores e mantenha nomes que expressem a intenção.

Erros comuns

O exemplo mínimo não substitui limites, tratamento de erros e observabilidade. read pode esperar indefinidamente se o peer não respeitar o protocolo. Ignorar drain aumenta memória; assumir que um read contém uma mensagem inteira quebra TCP.

Evite capturar exceções sem contexto ou retornar resultados parciais como se fossem completos. Uma falha explícita costuma ser mais segura que dados silenciosamente incorretos.

Como validar

Valide o comportamento, não apenas a linha feliz. Teste mensagens fragmentadas, múltiplas no mesmo pacote, conexão encerrada no meio e entrada acima do limite.

A documentação oficial, consultada em 28 de julho de 2026, detalha a API e deve ser a referência para mudanças futuras.