[pyar] Mejor manera de utilizar Sockets

Marcos Dione mdione en grulic.org.ar
Vie Sep 11 07:19:18 ART 2015


On Thu, Sep 10, 2015 at 08:01:35PM -0430, Enrique Alejandro Villafañe wrote:
> Pero ahora quiero saber como puedo
> dejar de estar en eso todo el tiempo si no que se comuniquen cuando halla
> algo que decir. He visto que hay sockets no bloqueantes, select, twisted,
> gevent. Bueno muchas cosas que he tratado de comprender y que no he podido
> por falta de idioma. Espero alguien me pueda guiar en el mundo de los
> sockets en general, que es mas recomendable, pienso que es importante
> aprender algo que me sirva para cosas avanzadas y muchas conexiones desde
> ya. Si hay algun material que desconozca tambien les agradeceria si me lo
> pueden compartir

    en español lamentablemente no. mi primer sugerencia es que aprendas
inglés :-/

    mi segunda sugerencia: si puedes usar python3.5 (que aún no salió,
pero las betas ya están estables), usaría asyncio con async/await. es lo
más parecido a programar con threads que hay.

    de ahí para atrás, depende mucho de tu problema, y es posible que sea
independiente de qué solución pongas del lado del cliente que del
servidor, y hasta es posible soluciones híbridas. 

    por supuesto que la forma más obvia y sencilla sigue siendo usar
threads, con una cola de mensajes (queue.Queue) entre el thread que
maneja la red y el de la UI, si es que tenés. y hablando de UI, PyQt por
ejemplo tiene una lib asyncrónica de red embebida en el sistema de events
de la UI, por lo que si te manejás con el mecanismos de eventos/señales
de Qt, es lo mismo. 

    volviendo a threads, el problema surge cuando varios threads usan los
mismos datos. ahí tenés que empezar a usar locks y la cosa se complica.
esto es más fácil de que suceda del lado del server que del cliente. una
solución es irse para el lado del async.

    async funciona mas o menos así: cuando vas a esperar la red (tanto en
el server esperando un request del cliente como en el cliente esperando
una respuesta del server), lo que hacés es asociar un callback, que es
llamado cuando llega algo por la red. el problema es que eso hace que un
algoritmo que use varias llamadas a red termine repartido en varias
funciones y el código queda horripilante. esto es mas o enos lo que
ofrece twisted y gevent y varios de ésos.

    el último paso es ir hacia corutinas, que es básicamente lo que
ofrece asyncio hasta python3.4. tiene la pinta de threads sin los
problemas de threads, pero con unas construcciones raras basadas en yield
y yield from. la evolución obvia de ello es el asyncio de python3.5 que
mencioné al principio, que parece más natural al leer.

    espero haberte mareado lo suficiente.

--  
(Not so) Random fortune: 
[...] things like alcohol gels are fine, and useful. But they're useful 
because they're basically a substitute for handwashing, if you're in a 
place where you can't wash.
	    -- Joel Gallant, professor of medicine and epidemiology at Johns Hopkins


More information about the pyar mailing list