selectors escolhe a implementação de multiplexação mais adequada ao sistema e expõe uma interface uniforme. Um loop pode esperar leitura ou escrita em vários descritores sem bloquear em apenas um.

Exemplo prático

import selectors
import socket

left, right = socket.socketpair()
with selectors.DefaultSelector() as selector:
    selector.register(left, selectors.EVENT_READ)
    right.sendall(b"ready")
    for key, _ in selector.select(timeout=1):
        print(key.fileobj.recv(1024).decode())
left.close()
right.close()

Registre interesse, não faça polling constante

Associe cada socket ao evento necessário e a um objeto de estado. select(timeout) dorme até algo ficar pronto ou o prazo terminar, evitando um loop que consome CPU sem trabalho.

Operações ainda podem ser parciais

Prontidão para escrita não garante que todo o buffer será enviado. Mantenha uma fila de saída, processe apenas o possível e altere os eventos registrados conforme o estado.

Limpeza e portabilidade

Remova o descritor do seletor antes de fechá-lo. Arquivos comuns e pipes têm diferenças entre sistemas; valide o tipo de recurso em todas as plataformas suportadas.

Continue estudando

Aprofunde a base com programação assíncrona com Python. A documentação oficial do Python, consultada em 22 de julho de 2026, detalha a API, as limitações e as diferenças entre versões.