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.