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.