219 votos

Una alternativa limpia y ligera para Python de torcido?

Un (largo) tiempo atrás escribí un web-araña que me multiproceso para habilitar de manera concurrente a ocurrir al mismo tiempo. Que estaba en mi Python de la juventud, en los días antes de que yo sabía sobre el GIL y los problemas asociados que se crea para multiproceso código (es decir, la mayoría del tiempo las cosas termina serializado!)...

Me gustaría volver a trabajar este código para hacerlo más robusto y de mejor desempeño. Básicamente hay dos formas de hacer esto: yo podría usar el nuevo módulo de multiprocesamiento en 2.6+ o yo podría ir para un reactor / evento-basada en el modelo de algún tipo. Más bien me gustaría hacer el después, ya que es mucho más sencillo y menos propenso a errores.

Así que la pregunta se refiere a lo que marco sería el más adecuado para mis necesidades. La siguiente es una lista de las opciones que sabemos hasta ahora:

  • Trenzado: El abuelo de Python reactor marcos: parece complejo y un poco hinchado sin embargo. Pronunciada curva de aprendizaje para una pequeña tarea.
  • Eventlet: De los chicos en lindenlab. Vireillo marco basado en que está orientada hacia este tipo de tareas. Tuve un vistazo al código y aunque no es muy bonita: no pep8 obediente, lleno de impresiones (¿por qué las personas hacen esto en un marco!?), API parece un poco inconsistente.
  • PyEv: Inmaduro, no parece ser cualquier persona usando ahora mismo a pesar de que se basa en libevent así que tiene un sólido respaldo.
  • asyncore: Desde la stdlib: über bajo nivel, parece como un montón de trabajo de campo solo para conseguir algo del suelo.
  • tornado: a Pesar de que este es un servidor orientado a producto diseñado para servidor de sitios web dinámicos hace cuentan con un async cliente HTTP y un simple ioloop. Parece que podría hacer el trabajo, pero no es lo que se pretendía. [editar: no se ejecuta en Windows, lamentablemente, lo que cuenta para mí - es un requisito para que yo apoyo esta cojo de la plataforma]

Hay algo que me he perdido? No hay duda de que debe ser una biblioteca, hay que ajusta el punto ideal de una versión simplificada de la async biblioteca de red!

[edit: muchas gracias a intgr para su puntero a esta página. Si se desplaza a la parte inferior podrás ver que hay una muy buena lista de proyectos que tienen como objetivo abordar esta tarea de una manera o de otra. Parece realmente que las cosas se han hecho, se trasladó desde el inicio de los Twisted: ahora la gente parece favorecer una co-rutina de solución basada en el lugar de un tradicional reactor / devolución de llamada orientada. Los beneficios de este enfoque son más clara, más directa código: ciertamente he encontrado en el pasado, especialmente cuando se trabaja con boost.asio en C++ que de devolución de llamada basado en código puede conducir a diseños que pueden ser difíciles de seguir, y que son relativamente desconocidos para el ojo inexperto. El uso de co-rutinas le permite escribir código que se ve un poco más sincrónico al menos. Supongo que ahora mi tarea es hacer que uno de estos muchas bibliotecas me gusta el look y darle un ir! Me alegro de haber pedido ahora...]

[editar: tal vez de interés para cualquier persona que lo siguen o topé con esta pregunta o se preocupa por este tema, en ningún sentido: he encontrado una gran valoración crítica del estado actual de las herramientas disponibles para este trabajo]

99voto

clemesha Puntos 1460

Twisted es complejo, estás en lo correcto. Twisted es no hinchado.

Si usted echa un vistazo aquí: http://twistedmatrix.com/trac/browser/trunk/twisted usted encontrará una manera organizada, amplio, y muy bien probado suite de muchos protocolos de internet, así como el ayudante de código para escribir e implementar muy sofisticadas aplicaciones de red. Yo no confundir la hinchazón con la exhaustividad.

Es bien sabido que el Trenzado de la documentación no es la más fácil de usar desde el primer vistazo, y creo que esto se aleja un lamentable número de personas. Pero Retorcido es increíble (mi humilde opinión) si pones en el tiempo. Yo lo hice y resultó ser la pena, y me gustaría recomendar a los demás a tratar de la misma.

56voto

Denis Bilenko Puntos 2975

gevent es eventlet limpiado.

API-sabio que sigue las mismas convenciones como la de la biblioteca estándar (en particular, roscado y módulos de multiprocesamiento) donde tiene sentido. Así que usted tiene de las cosas familiares como la Cola y el Evento a trabajar.

Sólo es compatible con libevent (actualización: libev desde 1.0) como de los reactores de la aplicación aprovecha al máximo, con un rápido WSGI servidor basado en libevent-http y resolver las consultas DNS a través de libevent-dns en vez de usar un grupo de subprocesos como la mayoría de las bibliotecas. (actualización: desde 1.0 c-ares es usado para hacer async las consultas de DNS; threadpool también es una opción.)

Como eventlet, hace que las devoluciones de llamada y Deferreds innecesarios mediante greenlets.

Echa un vistazo a los ejemplos: concurrente descargar de varias url, tiempo de sondeo webchat.

27voto

jkp Puntos 20410

Una muy interesante comparación de esos marcos fue compilado por Nicholas Piel en su blog: vale la pena leer!

27voto

intgr Puntos 9041

Me gustó la concurrencia módulo de Python que se basa en Stackless Python microhilos o Greenlets de la luz-peso roscado. Todos bloqueo de e/S de red es de un material transparente asincrónica a través de un único libevent bucle, por lo que debe ser casi tan eficaz como un verdadero asíncrona del servidor.

Supongo que es similar a Eventlet de esta manera.

La desventaja es que su API es muy diferente de la de Python sockets/threading módulos; necesidad de volver a escribir un poco justo de su solicitud (o escribir una compatibilidad calza la capa)

Edit: parece que hay también cogen, que es similar, pero utiliza Python 2.5 de la mejorada de los generadores por su co-rutinas, en lugar de Greenlets. Esto hace que sea más portátil que la concurrencia y otras alternativas. Red de e/S se realiza directamente con epoll/kqueue/iocp.

15voto

Adam Hupp Puntos 789

Ninguna de estas soluciones será evitar el hecho de que el GIL impide CPU paralelismo - son simplemente mejores maneras de conseguir IO paralelismo que ya tiene con hilos. Si piensas que puedes hacerlo mejor IO, por todos los medios persiguen uno de ellos, pero si su cuello de botella está en procesar los resultados nada aquí le ayudará a excepción del módulo de multiprocesamiento.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X