Twisted es un marco de programación de red basado en eventos escrito en Python y con licencia MIT .
Los proyectos Twisted admiten de diversas formas TCP , UDP , SSL/TLS , multidifusión IP , sockets de dominio Unix , muchos protocolos (incluidos HTTP , XMPP , NNTP , IMAP , SSH , IRC , FTP y otros) y mucho más. Twisted se basa en el paradigma de programación basada en eventos , lo que significa que los usuarios de Twisted escriben breves devoluciones de llamada que son llamadas por el marco.
Twisted está diseñado para una separación completa entre protocolos lógicos (que generalmente se basan en una semántica de conexión basada en flujo, como HTTP o POP3 ) y capas de transporte físico que soportan dicha semántica basada en flujo (como archivos, sockets o bibliotecas SSL). La conexión entre un protocolo lógico y una capa de transporte ocurre en el último momento posible, justo antes de que la información pase a la instancia del protocolo lógico. El protocolo lógico está informado de la instancia de la capa de transporte y puede utilizarla para enviar mensajes y comprobar la identidad del par. Tenga en cuenta que todavía es posible, en el código de protocolo, consultar profundamente la capa de transporte sobre problemas de transporte (como verificar un certificado SSL del lado del cliente). Naturalmente, dicho código de protocolo fallará ( generará una excepción ) si la capa de transporte no admite dicha semántica.
Un elemento central del modelo de aplicación Twisted es el concepto de diferido (en otros lugares llamado futuro ). Un diferido es una instancia de una clase diseñada para recibir y procesar un resultado que aún no se ha calculado, por ejemplo porque se basa en datos de un par remoto. Los diferidos se pueden distribuir, como los objetos normales, pero no se puede pedir su valor. Cada diferido admite una cadena de devolución de llamada. Cuando el diferido obtiene el valor, se pasa a las funciones en la cadena de devolución de llamada, y el resultado de cada devolución de llamada se convierte en la entrada para la siguiente. Los diferidos permiten operar con el resultado de una llamada a función antes de que su valor esté disponible.
Por ejemplo, si un diferido devuelve una cadena de un par remoto que contiene una dirección IP en formato cuádruple, se puede adjuntar una devolución de llamada para traducirla a un número de 32 bits. Cualquier usuario del diferido ahora puede tratarlo como diferido y devuelve un número de 32 bits. Esto, y la capacidad relacionada para definir "errbacks" (devoluciones de llamada que se denominan controladores de errores), permite que el código especifique de antemano qué hacer cuando ocurre un evento asincrónico, sin detenerse a esperar el evento. En sistemas no controlados por eventos, por ejemplo que utilizan subprocesos , el sistema operativo incurre en una sobrecarga prematura y adicional de organización de subprocesos cada vez que se realiza una llamada de bloqueo.
Twisted admite una abstracción sobre subprocesos sin formato, utilizando un subproceso como fuente diferida. Así, se devuelve inmediatamente un diferido, que recibirá un valor cuando finalice el hilo. Se pueden adjuntar devoluciones de llamada que se ejecutarán en el hilo principal, aliviando así la necesidad de soluciones de bloqueo complejas. Un excelente ejemplo de tal uso, que proviene de las bibliotecas de soporte de Twisted, es el uso de este modelo para llamar a bases de datos. La llamada a la base de datos ocurre en un hilo externo, pero el análisis del resultado ocurre en el hilo principal.
Twisted puede integrarse con bucles de eventos externos, como los de GTK+ , Qt y Cocoa (a través de PyObjC ). Esto permite usar Twisted como capa de red en programas de interfaz gráfica de usuario (GUI), usando todas sus bibliotecas sin agregar una sobrecarga de subproceso por socket, como lo haría el uso de la biblioteca nativa de Python. Un servidor web completo se puede integrar en proceso con un programa GUI utilizando este modelo, por ejemplo.