Este módulo proporciona la infraestructura básica para escribir clientes y servidores de servicios de socket asíncrono.
Hay dos formas de hacer que un programa en un único procesador haga ``más de una cosa a la vez.'' La programación multi-hilo o multi-hebra es la forma más simple y usual de hacerlo, pero hay otra técnica muy distinta, que tiene casi todas las ventajas de la multi-hebra, sin usar múltiples hilos de ejecución. Sólo es verdaderamente práctica si el programa depende en gran medida de los puertos de entrada/salida. Si el programa depende de la CPU, entonces las hebras de ejecución prioritaria son probablemente la mejor elección. No obstante, los servidores de red raramente dependen de la CPU.
Si el sistema operativo permite la llamada al sistema select() en su biblioteca de E/S (casi todos lo hacen), es posible emplearla para simular múltiples canales de comunicación a la vez, pudiendo realizar otra tarea mientras la comunicación E/S se produce en ``segundo plano''. Aunque esta estrategia puede parecer extraña y complicada, especialmente al principio, es en muchos aspectos mucho más fácil de enterder y controlar que la programación con múltiples hebras. El módulo descrito aquí resuelve muchos de los problemas más complejos, simplificando la tarea de construir sofisticados clientes y servidores de red de alto rendimiento.
El desencadenante de esos eventos de bajo nivel puede indicar si ciertos eventos de más alto nivel han ocurrido, depediendo del tiempo y el estado de la conexión. Por ejemplo, si se ha indicado a un socket que se conecte a otra máquina, se puede saber que la conexión se ha establecido cuando el socket dispara un evento de escritura (en ese momento se puede escribir en él con certeza de éxito). Los eventos implícitos de más alto nivel son:
Event | Description |
---|---|
handle_connect() |
Provocado por un evento de escritura |
handle_close() |
Provocado por un evento de lectura sin datos disponibles |
handle_accept() |
Provocado por un evento de lectura en un socket de escucha |
Este conjunto de eventos en el nivel de usuario es mayor que el de los básicos. La lista completa de métodos que pueden ignorarse en las subclasificaciones son:
def handle_write(self): sent = self.send(self.buffer) self.buffer = self.buffer[sent:]
1
,
indicando que -por defecto- todos los canales will be interested.
1
,
indicando que -por defecto- todos los canales will be interested. Además existen métodos básicos, necesarios para construir y manipular ``canales'', que son en este contexto las conexiones del socket. La mayoría de ellos son prácticamente idénticos a los métodos de socket.
(conn,
address)
donde conn es un nuevo objeto
socket que se puede emplear para enviar y recibir datos a través de
la conexión, y address es la dirección asignada al socket en
el otro extremo de la conexión.