selectors elige una implementación eficiente para el sistema operativo y presenta una interfaz uniforme. Un bucle puede esperar lectura o escritura en muchos descriptores sin bloquearse en uno solo.

Ejemplo práctico

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

Registra interés en vez de consultar sin pausa

Asocia cada socket con los eventos necesarios y un objeto de estado. select(timeout) espera hasta que haya trabajo o venza el plazo, evitando un bucle vacío que consume CPU.

Las operaciones pueden ser parciales

La disponibilidad de escritura no garantiza enviar todo el buffer. Conserva una cola de salida, procesa lo que acepte el socket y modifica los eventos según cambie el estado.

Limpieza y portabilidad

Elimina el descriptor del selector antes de cerrarlo. Los archivos comunes y pipes se comportan de manera distinta entre sistemas; prueba cada recurso compatible.

Sigue aprendiendo

Refuerza la base con programación asíncrona con Python. A documentación oficial de Python, consultada el 22 de julio de 2026, detalla la API, las limitaciones y las diferencias entre versiones.