Puedo prometer y prometo que me he leído todo!! Guau!! Estoy deseando llegar a la reunión y ver como os tiráis trastos ("de codigo") a la cabeza!<br><br><div class="gmail_quote">El 20 de abril de 2012 23:48, Aitor Guevara <span dir="ltr"><<a href="mailto:aitorciki@gmail.com">aitorciki@gmail.com</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">En fin, creo que esto puede hacerse eterno, porque tiene mucho más que<br>
ver con gustos personales que con limitaciones técnicas.<br>
<br>
Si Twisted fuese inusable y la gente no quisiese "ni tocarlo con un<br>
palo", llevaría muerto años (lleva casi 10 dando guerra). En cambio en<br>
la lista de proyectos gordos que lo usan<br>
(<a href="http://twistedmatrix.com/trac/wiki/SuccessStories" target="_blank">http://twistedmatrix.com/trac/wiki/SuccessStories</a>) veo cantidad de<br>
cosas no sólo nuevas, sino tremendamente exitosas (HipChat, TweetDeck,<br>
JustinTV, ...). OpenStack levanta una expectación brutal, y ahí lo<br>
tienes, Twisted de los pies a la cabeza.<br>
<br>
Evidentemente, que otros lo usen o no no lo convierte en bueno o malo,<br>
pero la gente detrás de esos productos precisamente tontos no son.<br>
<br>
Varios puntos que se han tocado estos días, y como lo veo yo, por si a<br>
alguien le interesa (lo que sigue es un buen tochaco, avisados<br>
estáis):<br>
<br>
* Twisted es complicado, no es Pythonico<br>
<br>
Sí pero no :) Escribir software de red asíncrono de cierto tamaño es<br>
complicado, se use la herramienta que se use. Si alguien cree en<br>
librerías mágicas que eliminan toda la complejidad y permiten crear<br>
sistemas para cientos de miles de usuarios como si fuese un script<br>
chorra, se equivoca, y punto.<br>
<br>
Que la herramienta me permita trabajar de manera más eficiente,<br>
pudiendo escribir menos (Python es muy expresivo) y facilitando que el<br>
código sea legible (Python desde luego apuesta por esa vía), perfecto.<br>
Que pretenda "ocultar" la complejidad inherente al sistema ya no me<br>
gusta tanto, eso no suele acabar bien. Y no acaba bien porque cuando<br>
las cosas empiezan a petar bajo carga, es muy probable que los errores<br>
ocurran fuera de mi comprensión del sistema, y ahora ves a entender la<br>
magia que hace la librería x.<br>
<br>
Del famoso Zen de Python, mi afirmación favorita es "Explicit is<br>
better than implicit." Creo que es lo que distingue a Python de Ruby,<br>
donde mucha magia ocurre de manera implícita. Twisted es explícito en<br>
su tratamiento de la asincronía, sí, y eso para mí es bueno. Más<br>
cuando mi modelo mental de asincronía encaja muy bien con lo que<br>
propone Twisted.<br>
<br>
* Twisted es un framework, te obliga a hacer las cosas a su manera, eso es malo<br>
<br>
Sí pero no :) Entiendo que, según las necesidades del software que se<br>
escribe, Twisted es matar moscas a cañonazos. Como lo es usar Django<br>
para según que aplicaciones web pequeñas. Pero no parece que a Django<br>
o Ruby on Rails les vaya mal por ser frameworks, parece que a la gente<br>
les son bien útiles.<br>
<br>
Si sólo quiero hacer unas cuantas peticiones HTTP a un servicio de por<br>
ahí, mover toda mi aplicación al modelo reactor / deferred de Twisted<br>
es una locura, sin duda. Ahora bien, si pretendo escribir un proceso<br>
que sirve HTTP y HTTPS, además de ser cliente de otro servicio web,<br>
que ofrece una interfaz SSH a su estado de ejecución, usa su propia<br>
política de resolución de DNS por temas de geolocalización y cache, y<br>
que también es servidor de WebSocket, Twisted es excelente. Es<br>
excelente porque ese programa es, en el 90%, código de red que implica<br>
varios protocolos como cliente y servidor. Puedo usar 8 librerías<br>
distintas, sí, y hacer que de algún modo funcionen juntas, y adaptarme<br>
a las peculiaridades de cada una. O puedo usar Twisted y escribir toda<br>
esa funcionalidad de manera integrada y con un único estilo.<br>
<br>
Y no, no es un caso de uso inventado, es el tipo de software que llevo<br>
años escribiendo para ganarme el pan :)<br>
<br>
* Twisted es feo, echa para atrás, nadie querría ni tocarlo con un palo, ...<br>
<br>
Mmmm, un poco sí, pero no :) Me costó introducirme en el modelo<br>
Twisted, viniendo del código procedural de toda la vida, habían cosas<br>
que no me encajaban. Además, todo ese camel case es horrible xD. Pero<br>
en algún momento se produjo un "click" en mi cabeza (como a la semana<br>
de usarlo, vamos, no penséis que lleva años) y de golpe todo tenía<br>
todo el sentido del mundo. El modelo de eventos, los protocolos, las<br>
cadenas de callbacks, de golpe todo encaja.<br>
<br>
Ahora mismo me costaría mucho pensar en código asíncrono de manera no<br>
orientada a eventos. Los eventos me parecen una manera muy natural de<br>
pensar: cuando pase x, haz y. No importa cuando sea, no esperes a que<br>
ocurra bloqueando. Yo te digo que cuando ocurra, quiero que lo hagas,<br>
y ya está. Como digo me parece muy natural. La sintaxis puede gustar<br>
más o menos, pero como con todo, es una simple cuestión de costumbre.<br>
<br>
* Resumiendo, que es gerundio.<br>
<br>
Entiendo que Twisted no guste a todo el mundo. De hecho, no está<br>
pensado para ser usado en cualquier proyecto, sólo en aquellos<br>
proyectos donde la comunicación de red es el núcleo del software. Y<br>
eso es una pequeña porción de todo el software que se escribe.<br>
<br>
Ahora bien, llevo cerca de 5 años escribiendo sistemas en Twisted.<br>
Sistemas que han soportado cargas totalmente locas (en Flumotion<br>
llegamos a tener cerca de 40Gbit/s de upload haciendo streaming para<br>
Antena3, TVE y otros). Me gusta Twisted, disfruto escribiéndolo y<br>
conozco a mucha gente que también lo hace. Es una solución excelente<br>
para un tipo dado de problema, y no valorarlo como tal por prejuicios<br>
me parece un error.<br>
<br>
Pero al final, todo es cuestión de gustos, si alguien no quiere<br>
usarlo, por mi perfecto. Pero si alguien tiene curiosidad, mi consejo<br>
es que no se deje asustar por tanto odio en la lista :)<br>
<br>
Ala, my two cents :)<br>
<div class="HOEnZb"><div class="h5"><br>
On Fri, Apr 20, 2012 at 20:21, Jesus Cea <<a href="mailto:jcea@jcea.es">jcea@jcea.es</a>> wrote:<br>
> -----BEGIN PGP SIGNED MESSAGE-----<br>
> Hash: SHA1<br>
><br>
> On 20/04/12 20:02, Josep Danti wrote:<br>
>> Hay algún caso en el que creo que gana twisted. Si se quieren usar<br>
>> puertos serie,  twisted lo tiene implementado. gevent no lo tiene<br>
>> por lo que en el primer read se quedaría bloqueado. Habría que<br>
>> implementar el servicio con greenlets ¿verdad? En general veo que<br>
>> Twisted tiene más protocolos.<br>
><br>
> Como ya he dicho, twisted es un framework.<br>
><br>
> Resumido, en cuanto tu código toca twisted, tiene que adaptarse a él y<br>
> se vuelve dependiente, y si quieres usar una librería no soportada, ya<br>
> puedes reescribirla...<br>
><br>
> Eso provoca que twisted incluya mucho ecosistema alrededor. Pero es<br>
> precisamente porque no se habla con nadie, así que todo lo que quieras<br>
> hacer depende de twisted. Básicamente twisted es un mundo aparte,<br>
> incluyo soporte de muchas cosas porque no es posible usar librerías<br>
> "normales".<br>
><br>
> Otros proyectos usando greenlets, por ejemplo, y con un simple<br>
> "monkeypatching" del módulo "socket" (trivial) pueden utilizar<br>
> CUALQUIER librería de terceros. Naturalmente, estos proyectos no<br>
> incluyen apenas nada "de serie". No lo necesitan, porque usan<br>
> cualquier librería python que encuentres y que te venga bien. No es<br>
> necesario que esa librería esté programada para "twisted".<br>
><br>
> Ejemplo simple:<br>
><br>
> Si mi libreria hace "monkeypatch" de "socket" haciendo que cualquier<br>
> lectura o escritura se meta automáticamente en un "select" y que ese<br>
> "greenlet" se pare o se reanude cuando toca, mi programa puede usar<br>
> CUALQUIER librería de la biblioteca estándar, como "smtplib" para<br>
> enviar 1000 mensajes en paralelo sin tener que tocar esa librería y<br>
> sin lanzar ni un solo hilo.<br>
><br>
> Eso con twisted no se puede hacer.<br>
><br>
> Así que sí, twisted incluye muchas cosa de serie... porque no tiene<br>
> más remedio. Si necesitas algo que no está ahí, o no te gusta cómo lo<br>
> hace... prepárate a sufrir.<br>
><br>
> En su caso, si manejas el puerto serie como un fichero, puedes usar<br>
> "select" o similares. Si tienes que hacer muchas más cosas a la vez,<br>
> greenlets con un pelín de monkeypatching, o una librería específica<br>
> como gevent o similar.<br>
><br>
> PS: Yo sigo usando "poll" de forma masiva.<br>
><br>
> - --<br>
> Jesus Cea Avion                         _/_/      _/_/_/        _/_/_/<br>
> <a href="mailto:jcea@jcea.es">jcea@jcea.es</a> - <a href="http://www.jcea.es/" target="_blank">http://www.jcea.es/</a>     _/_/    _/_/  _/_/    _/_/  _/_/<br>
> jabber / <a href="mailto:xmpp%3Ajcea@jabber.org">xmpp:jcea@jabber.org</a>         _/_/    _/_/          _/_/_/_/_/<br>
> .                              _/_/  _/_/    _/_/          _/_/  _/_/<br>
> "Things are not so easy"      _/_/  _/_/    _/_/  _/_/    _/_/  _/_/<br>
> "My name is Dump, Core Dump"   _/_/_/        _/_/_/      _/_/  _/_/<br>
> "El amor es poner tu felicidad en la felicidad de otro" - Leibniz<br>
> -----BEGIN PGP SIGNATURE-----<br>
> Version: GnuPG v1.4.10 (GNU/Linux)<br>
> Comment: Using GnuPG with Mozilla - <a href="http://enigmail.mozdev.org/" target="_blank">http://enigmail.mozdev.org/</a><br>
><br>
> iQCVAwUBT5GpIJlgi5GaxT1NAQLzxAP/W43EyV82FmbCQuV8WqFTmP9KGIPppSq+<br>
> udSIn/xtsLWYpA9WsZ9SwTs+t9dxqX7zksd9E8uhE57PnX3x8Oc6OkOnWt6opJ1A<br>
> Vdn9j0b8C9Fy8CiJmUqODoQmmDIzri6PuMKZa+NcqOSYDL4Hly8gMFIzITEbF9/H<br>
> bVgIxTEDZIA=<br>
> =nOTT<br>
> -----END PGP SIGNATURE-----<br>
><br>
> --<br>
> Grupo de usuarios de python ubicados en Madrid<br>
> <a href="http://groups.google.es/group/python-madrid" target="_blank">http://groups.google.es/group/python-madrid</a><br>
> <a href="http://python-madrid.es" target="_blank">http://python-madrid.es</a><br>
> <a href="http://twitter.com/#!/python_madrid" target="_blank">http://twitter.com/#!/python_madrid</a><br>
> Para darte de baja del grupo envía un mensaje a <a href="mailto:python-madrid%2Bunsubscribe@googlegroups.com">python-madrid+unsubscribe@googlegroups.com</a><br>
<br>
--<br>
Grupo de usuarios de python ubicados en Madrid<br>
<a href="http://groups.google.es/group/python-madrid" target="_blank">http://groups.google.es/group/python-madrid</a><br>
<a href="http://python-madrid.es" target="_blank">http://python-madrid.es</a><br>
<a href="http://twitter.com/#!/python_madrid" target="_blank">http://twitter.com/#!/python_madrid</a><br>
Para darte de baja del grupo envía un mensaje a <a href="mailto:python-madrid%2Bunsubscribe@googlegroups.com">python-madrid+unsubscribe@googlegroups.com</a><br>
</div></div></blockquote></div><br>

<p></p>

-- <br />
Grupo de usuarios de python ubicados en Madrid<br />
<a href="http://groups.google.es/group/python-madrid">http://groups.google.es/group/python-madrid</a><br />
<a href="http://python-madrid.es">http://python-madrid.es</a><br />
<a href="http://twitter.com/#!/python_madrid">http://twitter.com/#!/python_madrid</a><br />
Para darte de baja del grupo envía un mensaje a python-madrid+unsubscribe@googlegroups.com<br />