Hace (mucho tiempo) escribí una araña web que multiprocedí para permitir que se produjeran solicitudes concurrentes al mismo tiempo. Eso fue en mi juventud de Python, en los días antes de que supiera sobre el GIL y los problemas asociados que crea para el código multiproceso (IE, ¡la mayoría de las veces las cosas terminan en serie!) ...
Me gustaría volver a trabajar este código para hacerlo más robusto y tener un mejor rendimiento. Básicamente, podría hacer esto de dos maneras: podría usar el nuevo módulo de multiprocesamiento en 2.6+ o podría optar por un modelo basado en un reactor / evento de algún tipo. Prefiero hacerlo más tarde, ya que es mucho más simple y menos propenso a errores.
Entonces, la pregunta se refiere a qué marco sería el más adecuado para mis necesidades. La siguiente es una lista de las opciones que conozco hasta ahora:
- Twisted : El abuelo de los marcos de reactores Python: parece complejo y un poco hinchado Curva de aprendizaje empinada para una tarea pequeña.
- Eventlet : De los chicos de lindenlab . Marco basado en Greenlet orientado a este tipo de tareas. Sin embargo, eché un vistazo al código y no es demasiado bonito: no cumple con pep8, está disperso con impresiones (¿por qué la gente hace esto en un marco?), API parece un poco inconsistente.
- PyEv : Inmaduro, parece que nadie lo está usando en este momento, aunque está basado en liberant, por lo que tiene un backend sólido.
- asyncore : De stdlib: über de bajo nivel, parece mucho trabajo de campo involucrado solo para sacar algo del suelo.
- tornado : Aunque este es un producto orientado al servidor diseñado para servidores de sitios web dinámicos, presenta un cliente HTTP asíncrono y un simple ioloop . Parece que podría hacer el trabajo pero no para lo que estaba destinado. [editar: desafortunadamente no se ejecuta en Windows, lo cual lo cuenta para mí, es un requisito para mí admitir esta plataforma aburrida]
¿Hay algo que me haya perdido? ¡Seguramente debe haber una biblioteca por ahí que se ajuste al punto óptimo de una biblioteca de red asincrónica simplificada!
[edit: muchas gracias a intgr por su puntero a esta página . Si se desplaza hacia abajo, verá que hay una lista muy buena de proyectos que tienen como objetivo abordar esta tarea de una forma u otra. En realidad, parece que las cosas han avanzado desde el inicio de Twisted: las personas ahora parecen favorecer una solución basada en la co-rutina en lugar de una solución tradicional orientada al reactor / devolución de llamada. Los beneficios de este enfoque son un código más directo más claro: ciertamente lo he encontrado en el pasado, especialmente cuando trabajo con boost.asioen C ++, ese código basado en la devolución de llamada puede conducir a diseños que pueden ser difíciles de seguir y son relativamente oscuros para el ojo inexperto. El uso de co-rutinas le permite escribir código que parece un poco más sincrónico al menos. ¡Supongo que ahora mi tarea es averiguar cuál de estas bibliotecas me gusta y probarla! Me alegro de haber preguntado ahora ...]
[editar: tal vez sea de interés para cualquiera que haya seguido o tropezado con esta pregunta o que se preocupe por este tema en algún sentido: encontré una excelente reseña del estado actual de las herramientas disponibles para este trabajo]
select
para la multiplexación de E / S. Pero debería poder obtener un rendimiento decente con tornado-pyuv . 2. Ahora hay asyncio en Python 3.3+ y su backport trollius que permite ejecutar cualquier aplicación Tornado en su bucle de eventos (Twisted será compatible pronto).