SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
Usando Twisted para hacer aplicaciones
     de escritorio no bloqueantes

                             Martín Volpe
                                @martinvol

                     PyCon Argentina
          Bernal, Buenos Aires, Argentina, Noviembre 2012

Versión online: http://volteck.net/development/twisted-escritorio-charla.rar
Aclaraciones:

• Para el objetivo de esta charla: Twisted = Asincrónico
• Twisted no es la única forma
• Los ejemplos van a ser triviales
• Los usuarios se desesperan fácil

• ¿Alguien programó en Assembler? (no se asusten!)
Problema:
• La aplicación se congela (no necesariamente satura
 el CPU)




                                  tú software
Objetivos de la charla:

 • Entender porque las aplicaciones se bloquean

 • Mostrar como Twisted se acopla a este problema

 • Entender las diferentes herramientas que tiene Twisted
   para solucionarlos

 • Entender que Twisted sólo parece magia, pero no lo es,
   ¡Es Python!
¿Por qué pasa esto?:
¡Es culpa del reactor! ok..., para, ¿Qué es un reactor?
Un loop.
# esto!
while True:
    stuff = wait_for_stuff(timeout)

    if stuff:
        stuff.execute()
        run_timed_events()

    #si esto tarda en llamarse, la interfaz se bloquea
    refresh_GUI() #esta función de por si, tambien bloquea

• El reactor de Gtk, Qt, Wx y TKinter se pueden resumir a algo
  parecido a esto.
• Los que hayan programado con PyGame seguramente
  reconozcan este snippet
¿Por qué pasa esto?:
                    Esperar eventos




                   Bucle del reactor




                   Ejecutar eventos


$ python examples/1.py
¿Por qué pasa esto?
¡¡Es culpa del reactor!! ok..., pero, ¿Que es un reactor?




                             Bucle del reactor




                   Toolkit                       Callback

                 Tu código




$ python examples/2.py
Twisted:
• Nada mas ni nada menos que un FrameWork escrito en
  Python
• Incluye un reactor extendible
• Originalmente creado para NetWorking, feature que
  podemos seguir utilizando para aplicaciones gráficas
• Empezó a escribirse en 2002: es maduro y estable;
• Por esto mismo: no respeta PEP8
• Es MUY extenso
• Licenciado bajo MIT License



http://twistedmatrix.com
Dos conceptos

• The Hollywood principle: No nos llames, nosotros te
  llamamos (no tan crítico en aplicaciones de escritorio)
• Multitasking cooperativo: todos compartimos el reactor,
  nos comprometemos a liberarlo lo mas rápido posible
Ejemplos típicos:
• Buscar un recurso de red: urllib, sockets, etc
• Bucles y algoritmos matemáticos
• Llamadas a base de datos
• Interactuar con hardware
• print() (!!!)
• tus funciones

Estos ejemplos pueden no bloquear en todas las oportunidades,
hasta que bloquean.
Casi todo se puede implementar como función no bloqueante, lo
que no implica que sea la manera mas difundida (u obvia)
$ python examples/slow_server.py &
$ python examples/3.py
Una solución: Threads
Puede servir:
  • Poco overhead
  • Comparte el namespace
Pero:
  • Muy poco control sobre lo que se está ejecutando (no se
    pueden detener!)
  • Interactuar con el GIL: http://blip.tv/carlfk/mindblowing-python-gil-2243379

Un ejemplo:
http://python.org.ar/pyar/Recetario/Gui/Gtk/MultiThread
Otra solución: Multiprocessing
Puede servir:
   • Se puede detener la ejecución
   • Utiliza múltiples cores (si el procesador es multi-core
     puede correr rápido)
Pero:
   • Overhead, abre otro intérprete de Python completamente
     independiente
   • Por eso mismo: no comparte namespace (hay que usar
     Queues o Pipes)
http://python.org.ar/pyar/Recetario/MultiprocessingYThreading
Twisted: multitarea colaborativa
En el 99% de los casos esas soluciones clásicas son
aplicables, pero eso no quiere decir que sean las mas
adecuadas
        Tarea 1


                       Tarea 1   Tarea 2   Tarea 3
        Tarea 2



        Tarea 3




                  Tiempo
Deferred:
Es un objeto que nos ayuda a controlar flujos de ejecución
asincrónicos
                             Fuente de datos




                                    Deferred

                        resultado              error
                    C
                                                       E
                    a
                                                       r
                    l
                                                       r
                    l
                                                       b
                    b
                                                       a
                    a
                                                       c
                    c
                                                       k
                    k
                                                       s
                    s
Deferred:
Es un objeto que nos ayuda a controlar flujos de ejecución
asincrónicos
                Loop                 Callbacks




                                   otros deferreds pueden
                                          ejecutarse
Deferred:
Sincrónico:

try:
  resultado = get_data_bloqueante()
  resultado = procesa_datos(resultado)
except Exception, e:
  resultado = maneja_excepcion(e)

Asincrónico:

d = get_data()
d.addCallback(procesa_datos)
d.addErrback(maneja_excepcion)
Deferred:
class X:
Sincrónico:
  def get_data(self):
    # lanzo algo que eventualmente
    # llame a data_ready
    self.d = Deferred()
    return self.d

  def data_ready(self, data):
    self.d.callback(data)


service = X()
service.get_data().addCallbacks(callbacks)
Deferred:
try:
  guardar_bloqueante(unDato)
except Exception, e:
  print "Algo no anduvo."



d = guardar_no_bloqueante(unDato)
# retorna enseguida

def handle(error):
  print "Algo no anduvo."

d.addErrback(handle)
TIP: Es importante encapsular el código
Respetar el paradigma orientado a objetos nos ahorra
dolores de cabeza:
import guitoolkit

class Gui:
  def on_button_click(self, widget): ...
  def hide_entry1(self): ...

class   App():
  def   __init__(self, gui): ...
  def   guardar(self): ...
  def   conseguir_datos(self): ...

if __name__ == '__main__':
  gui_inst = Gui()
  App(gui_inst)
  guitoolkit.run()
Twisted entra en acción:
• Twisted es un framework diseñado para el desarrollo de
   aplicaciones web; es basado en eventos
• Incluye su propio reactor
• Este reactor puede ser acoplado con Gtk, Tkinter, PyUI,
   wxPython
• El reactor se puede acoplar a otros frameworks, como
   PyGame.
• Y Qt? Por problemas de licencias no está incluido con el
   código de twisted, pero se puede descargar por separado
   http://twistedmatrix.com/trac/wiki/QTReactor

Documentación sobre los diferentes reactors:
http://twistedmatrix.com/documents/current/core/howto/choos
ing-reactor.html
Integrando con el toolkit gráfico:
from twisted.internet import gtk2reactor
# varía dependiendo el toolkit a integrar
gtk2reactor.install()

# todo tu código
# ...

from twisted.internet import reactor
# arrancamos el reactor de twisted
reactor.run()

$ python examples/twisted/1.py

• ¿Notaron que el código de gtk no cambio y no se rompió nada?
• Tambien hay que notar que sigue fallando en el mismo lugar,
  acordate: ¡Twisted no hace magia!
Herramientas que incluye Twisted:
Estandariza muchas acciones comunes:
  • reactor.callLater(segundos, funcion, *args, **kw), Llama a
    funcion despues de pasados tantos segundos
  • reactor.callWhenRunning(funcion, *args, **kw), Llama a funcion
    cuando el reactor empieza a ejecutarse
  • deferToThread(funcion, *args, **kwargs), Ejecuta funcion en otro
    thread y retorna un objeto Deferred
  • @inlineCallbacks, transforma funciones comunes en funciones
    asincrónicas (para retornar hay que usar returnValue)
  • Deferred.cancel(), cancelar una tarea en curso dentro de un
    deferred
  • deferLater(reactor, segundos, funcion), ejecuta funcion pasados
   tantos segundos, y retorna un objeto Deferred

Y las API's de los diferentes toolkits siguen funcionando, Twisted
actua como un plugin.
Twisted entra en acción:

Reimplementemos los ejemplos usando lo que ya sabemos:



$ python examples/twisted/2.1.py

$ python examples/twisted/2.2.py # detenible

$ python examples/twisted/3.1.py

$ python examples/twisted/3.2.py # detenible
Caso práctico: Donnees
• Tareas asincrónicas
  • Servidor Web
  • Base de datos
  • Gráficos en tiempo real
• Threads implementados con Twisted
  • Envío de e-mail y generación de reportes (podría haber usado
   twisted.mail.smtp.sendmail)
  • Tomar datos del puerto serie

Repo: https://github.com/maritnvol/Donnees-Acquisition-Data-software
$ git clone git@github.com:maritnvol/Donnees-Acquisition-
  Data-software.git
$ cd Donnees-Acquisition-Data-software/Donnees
$ python tilapia.py
Fuentes:

• http://www.artima.com/weblogs/viewpost.jsp?thread=230001
• http://twistedmatrix.com/documents/current/core/howto/process.html
• http://www.juanjoconti.com.ar/2010/12/01/videos-de-las-charlas-en-junin
• http://python.org.ar/pyar/CharlasAbiertas2010/Twisted
• http://krondo.com/blog/?page_id=1327
• http://mumak.net/stuff/twisted-intro.html
¡¡Muchas Gracias!!
        Happy Coding!


  ¿¿Preguntas??

        Martín Volpe
           @martinvol
  http://about.me/MartinVolpe
   martin.volpe@gmail.com

Weitere ähnliche Inhalte

Was ist angesagt?

Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJavaParadigma Digital
 
El lenguaje de pogramación C++
El lenguaje de pogramación C++El lenguaje de pogramación C++
El lenguaje de pogramación C++Rodrigo Corral
 
Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testingAgustin Ramos
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scaladhaat
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en javaLuis Miguel De Bello
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threadsflekoso
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasAgustin Ramos
 
Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018
Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018
Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018Codemotion
 
Tecnicas de Blind-Mysql-Injection
Tecnicas de Blind-Mysql-InjectionTecnicas de Blind-Mysql-Injection
Tecnicas de Blind-Mysql-Injectionq3rv0
 
Mule Librerias en Java
Mule Librerias en JavaMule Librerias en Java
Mule Librerias en JavaManuel Antonio
 
Introducción a la Progamación en Javascript. Classe 2
Introducción a la Progamación en Javascript. Classe 2Introducción a la Progamación en Javascript. Classe 2
Introducción a la Progamación en Javascript. Classe 2xjordi
 

Was ist angesagt? (18)

Programación Reactiva con RxJava
Programación Reactiva con RxJavaProgramación Reactiva con RxJava
Programación Reactiva con RxJava
 
TUTORIAL JAVA
TUTORIAL JAVATUTORIAL JAVA
TUTORIAL JAVA
 
Viernes Tecnicos DTrace
Viernes Tecnicos DTraceViernes Tecnicos DTrace
Viernes Tecnicos DTrace
 
Lab5 guia
Lab5 guiaLab5 guia
Lab5 guia
 
El lenguaje de pogramación C++
El lenguaje de pogramación C++El lenguaje de pogramación C++
El lenguaje de pogramación C++
 
Chap 15gpin
Chap 15gpinChap 15gpin
Chap 15gpin
 
Guia final so
Guia final soGuia final so
Guia final so
 
Pairwise and property based testing
Pairwise and property based testingPairwise and property based testing
Pairwise and property based testing
 
Introducción a Scala
Introducción a ScalaIntroducción a Scala
Introducción a Scala
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en java
 
SCJP, Clase 9: Threads
SCJP, Clase 9: ThreadsSCJP, Clase 9: Threads
SCJP, Clase 9: Threads
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
 
Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018
Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018
Julio Chana | Extendiendo kubernetes | Codemotion Madrid 2018
 
Tecnicas de Blind-Mysql-Injection
Tecnicas de Blind-Mysql-InjectionTecnicas de Blind-Mysql-Injection
Tecnicas de Blind-Mysql-Injection
 
De Threads a CompletableFutures
De Threads a CompletableFuturesDe Threads a CompletableFutures
De Threads a CompletableFutures
 
Mule Librerias en Java
Mule Librerias en JavaMule Librerias en Java
Mule Librerias en Java
 
Introducción a la Progamación en Javascript. Classe 2
Introducción a la Progamación en Javascript. Classe 2Introducción a la Progamación en Javascript. Classe 2
Introducción a la Progamación en Javascript. Classe 2
 
Traduccion capitulo 9 (completo)
Traduccion capitulo 9 (completo)Traduccion capitulo 9 (completo)
Traduccion capitulo 9 (completo)
 

Andere mochten auch

Hillside-Quadra Community News Summer 2015
Hillside-Quadra Community News Summer 2015Hillside-Quadra Community News Summer 2015
Hillside-Quadra Community News Summer 2015Hillside-Quadra News
 
Embarazo [reparado]
Embarazo [reparado]Embarazo [reparado]
Embarazo [reparado]ELM2
 
North temprate and tropical day time flow
North temprate and tropical day time flowNorth temprate and tropical day time flow
North temprate and tropical day time flowFassil
 
China, el primer mercado mundial de consumo
China, el primer mercado mundial de consumoChina, el primer mercado mundial de consumo
China, el primer mercado mundial de consumoMarco Vinicio Ruiz
 
Adrad Performance Cooling 2013 Catalog
Adrad Performance Cooling 2013 CatalogAdrad Performance Cooling 2013 Catalog
Adrad Performance Cooling 2013 CatalogRimsky Cheng
 
8 Turismo de China:Centro y Sur(2)
8 Turismo de China:Centro y Sur(2)8 Turismo de China:Centro y Sur(2)
8 Turismo de China:Centro y Sur(2)崔 辰
 
Introduccion a GNU Cash - Ras Delmmza
Introduccion a GNU Cash - Ras DelmmzaIntroduccion a GNU Cash - Ras Delmmza
Introduccion a GNU Cash - Ras DelmmzaPablo Pizarro
 
Propietat Industrial i Patents - Formació 2013 per NC Consultors
Propietat Industrial i Patents - Formació 2013 per NC ConsultorsPropietat Industrial i Patents - Formació 2013 per NC Consultors
Propietat Industrial i Patents - Formació 2013 per NC ConsultorsNina Costas
 
Una sociedad en la bruma de la ciudad fantasma
Una sociedad en la bruma de la ciudad fantasmaUna sociedad en la bruma de la ciudad fantasma
Una sociedad en la bruma de la ciudad fantasmaJavier Gustavo Bonafina
 
5095 gylon gasketing (1)
5095 gylon gasketing (1)5095 gylon gasketing (1)
5095 gylon gasketing (1)Doğan Çekim
 
Minikitneo quick start-guide-en-ru-tc-pl.pdf
Minikitneo quick start-guide-en-ru-tc-pl.pdfMinikitneo quick start-guide-en-ru-tc-pl.pdf
Minikitneo quick start-guide-en-ru-tc-pl.pdfqbq903
 
Megaestafa 0123 Bernardo Alejandro Guerra
Megaestafa 0123 Bernardo Alejandro GuerraMegaestafa 0123 Bernardo Alejandro Guerra
Megaestafa 0123 Bernardo Alejandro GuerraConcejo de Medellín
 
Viva la causa! formacion de frases
Viva la causa! formacion de frasesViva la causa! formacion de frases
Viva la causa! formacion de frasesChristi Ivers
 
La prevención cerca de tí. Material didáctico
La prevención cerca de tí. Material didácticoLa prevención cerca de tí. Material didáctico
La prevención cerca de tí. Material didácticoEDUCACIÓN TOLEDO
 
Presentación Prevención de Lavado Activos Segundo Debate
Presentación Prevención de Lavado Activos Segundo DebatePresentación Prevención de Lavado Activos Segundo Debate
Presentación Prevención de Lavado Activos Segundo DebateEla Zambrano
 

Andere mochten auch (20)

Hillside-Quadra Community News Summer 2015
Hillside-Quadra Community News Summer 2015Hillside-Quadra Community News Summer 2015
Hillside-Quadra Community News Summer 2015
 
Embarazo [reparado]
Embarazo [reparado]Embarazo [reparado]
Embarazo [reparado]
 
North temprate and tropical day time flow
North temprate and tropical day time flowNorth temprate and tropical day time flow
North temprate and tropical day time flow
 
China, el primer mercado mundial de consumo
China, el primer mercado mundial de consumoChina, el primer mercado mundial de consumo
China, el primer mercado mundial de consumo
 
Adrad Performance Cooling 2013 Catalog
Adrad Performance Cooling 2013 CatalogAdrad Performance Cooling 2013 Catalog
Adrad Performance Cooling 2013 Catalog
 
8 Turismo de China:Centro y Sur(2)
8 Turismo de China:Centro y Sur(2)8 Turismo de China:Centro y Sur(2)
8 Turismo de China:Centro y Sur(2)
 
Introduccion a GNU Cash - Ras Delmmza
Introduccion a GNU Cash - Ras DelmmzaIntroduccion a GNU Cash - Ras Delmmza
Introduccion a GNU Cash - Ras Delmmza
 
Propietat Industrial i Patents - Formació 2013 per NC Consultors
Propietat Industrial i Patents - Formació 2013 per NC ConsultorsPropietat Industrial i Patents - Formació 2013 per NC Consultors
Propietat Industrial i Patents - Formació 2013 per NC Consultors
 
Una sociedad en la bruma de la ciudad fantasma
Una sociedad en la bruma de la ciudad fantasmaUna sociedad en la bruma de la ciudad fantasma
Una sociedad en la bruma de la ciudad fantasma
 
Eunice Cota
Eunice CotaEunice Cota
Eunice Cota
 
5095 gylon gasketing (1)
5095 gylon gasketing (1)5095 gylon gasketing (1)
5095 gylon gasketing (1)
 
Comunicación
ComunicaciónComunicación
Comunicación
 
Minikitneo quick start-guide-en-ru-tc-pl.pdf
Minikitneo quick start-guide-en-ru-tc-pl.pdfMinikitneo quick start-guide-en-ru-tc-pl.pdf
Minikitneo quick start-guide-en-ru-tc-pl.pdf
 
Trabk D Adm
Trabk D AdmTrabk D Adm
Trabk D Adm
 
Megaestafa 0123 Bernardo Alejandro Guerra
Megaestafa 0123 Bernardo Alejandro GuerraMegaestafa 0123 Bernardo Alejandro Guerra
Megaestafa 0123 Bernardo Alejandro Guerra
 
Viva la causa! formacion de frases
Viva la causa! formacion de frasesViva la causa! formacion de frases
Viva la causa! formacion de frases
 
La prevención cerca de tí. Material didáctico
La prevención cerca de tí. Material didácticoLa prevención cerca de tí. Material didáctico
La prevención cerca de tí. Material didáctico
 
Presentación Prevención de Lavado Activos Segundo Debate
Presentación Prevención de Lavado Activos Segundo DebatePresentación Prevención de Lavado Activos Segundo Debate
Presentación Prevención de Lavado Activos Segundo Debate
 
Manage Office Noise
Manage Office NoiseManage Office Noise
Manage Office Noise
 
La vida en los desiertos
La vida en los desiertosLa vida en los desiertos
La vida en los desiertos
 

Ähnlich wie Usando Twisted para hacer aplicaciones de escritorio no bloqueantes

Ähnlich wie Usando Twisted para hacer aplicaciones de escritorio no bloqueantes (20)

Desarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con TwistedDesarrollando aplicaciones de red con Twisted
Desarrollando aplicaciones de red con Twisted
 
Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Caracteristicas de C Sharp
Caracteristicas de C SharpCaracteristicas de C Sharp
Caracteristicas de C Sharp
 
JAVA.PPT
JAVA.PPTJAVA.PPT
JAVA.PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
JAVA (1).PPT
JAVA (1).PPTJAVA (1).PPT
JAVA (1).PPT
 
librerias.pptx
librerias.pptxlibrerias.pptx
librerias.pptx
 
Realidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapirRealidad Aumentada 01 documentacion tapir
Realidad Aumentada 01 documentacion tapir
 
SICRONIZACION DE PROCESOS
SICRONIZACION DE PROCESOSSICRONIZACION DE PROCESOS
SICRONIZACION DE PROCESOS
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Tutorial c++
Tutorial c++Tutorial c++
Tutorial c++
 
Introducción a Python
Introducción a PythonIntroducción a Python
Introducción a Python
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Doc tutorial-c++
Doc tutorial-c++Doc tutorial-c++
Doc tutorial-c++
 
Programando en java
Programando en javaProgramando en java
Programando en java
 
Introducción a Celery y las colas de tareas asíncronas
Introducción a Celery y las colas de tareas asíncronasIntroducción a Celery y las colas de tareas asíncronas
Introducción a Celery y las colas de tareas asíncronas
 

Kürzlich hochgeladen

Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxFederico Castellari
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIhmpuellon
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxJorgeParada26
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativanicho110
 

Kürzlich hochgeladen (12)

Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 

Usando Twisted para hacer aplicaciones de escritorio no bloqueantes

  • 1. Usando Twisted para hacer aplicaciones de escritorio no bloqueantes Martín Volpe @martinvol PyCon Argentina Bernal, Buenos Aires, Argentina, Noviembre 2012 Versión online: http://volteck.net/development/twisted-escritorio-charla.rar
  • 2. Aclaraciones: • Para el objetivo de esta charla: Twisted = Asincrónico • Twisted no es la única forma • Los ejemplos van a ser triviales • Los usuarios se desesperan fácil • ¿Alguien programó en Assembler? (no se asusten!)
  • 3. Problema: • La aplicación se congela (no necesariamente satura el CPU) tú software
  • 4. Objetivos de la charla: • Entender porque las aplicaciones se bloquean • Mostrar como Twisted se acopla a este problema • Entender las diferentes herramientas que tiene Twisted para solucionarlos • Entender que Twisted sólo parece magia, pero no lo es, ¡Es Python!
  • 5. ¿Por qué pasa esto?: ¡Es culpa del reactor! ok..., para, ¿Qué es un reactor? Un loop. # esto! while True: stuff = wait_for_stuff(timeout) if stuff: stuff.execute() run_timed_events() #si esto tarda en llamarse, la interfaz se bloquea refresh_GUI() #esta función de por si, tambien bloquea • El reactor de Gtk, Qt, Wx y TKinter se pueden resumir a algo parecido a esto. • Los que hayan programado con PyGame seguramente reconozcan este snippet
  • 6. ¿Por qué pasa esto?: Esperar eventos Bucle del reactor Ejecutar eventos $ python examples/1.py
  • 7. ¿Por qué pasa esto? ¡¡Es culpa del reactor!! ok..., pero, ¿Que es un reactor? Bucle del reactor Toolkit Callback Tu código $ python examples/2.py
  • 8. Twisted: • Nada mas ni nada menos que un FrameWork escrito en Python • Incluye un reactor extendible • Originalmente creado para NetWorking, feature que podemos seguir utilizando para aplicaciones gráficas • Empezó a escribirse en 2002: es maduro y estable; • Por esto mismo: no respeta PEP8 • Es MUY extenso • Licenciado bajo MIT License http://twistedmatrix.com
  • 9. Dos conceptos • The Hollywood principle: No nos llames, nosotros te llamamos (no tan crítico en aplicaciones de escritorio) • Multitasking cooperativo: todos compartimos el reactor, nos comprometemos a liberarlo lo mas rápido posible
  • 10. Ejemplos típicos: • Buscar un recurso de red: urllib, sockets, etc • Bucles y algoritmos matemáticos • Llamadas a base de datos • Interactuar con hardware • print() (!!!) • tus funciones Estos ejemplos pueden no bloquear en todas las oportunidades, hasta que bloquean. Casi todo se puede implementar como función no bloqueante, lo que no implica que sea la manera mas difundida (u obvia) $ python examples/slow_server.py & $ python examples/3.py
  • 11. Una solución: Threads Puede servir: • Poco overhead • Comparte el namespace Pero: • Muy poco control sobre lo que se está ejecutando (no se pueden detener!) • Interactuar con el GIL: http://blip.tv/carlfk/mindblowing-python-gil-2243379 Un ejemplo: http://python.org.ar/pyar/Recetario/Gui/Gtk/MultiThread
  • 12. Otra solución: Multiprocessing Puede servir: • Se puede detener la ejecución • Utiliza múltiples cores (si el procesador es multi-core puede correr rápido) Pero: • Overhead, abre otro intérprete de Python completamente independiente • Por eso mismo: no comparte namespace (hay que usar Queues o Pipes) http://python.org.ar/pyar/Recetario/MultiprocessingYThreading
  • 13. Twisted: multitarea colaborativa En el 99% de los casos esas soluciones clásicas son aplicables, pero eso no quiere decir que sean las mas adecuadas Tarea 1 Tarea 1 Tarea 2 Tarea 3 Tarea 2 Tarea 3 Tiempo
  • 14. Deferred: Es un objeto que nos ayuda a controlar flujos de ejecución asincrónicos Fuente de datos Deferred resultado error C E a r l r l b b a a c c k k s s
  • 15. Deferred: Es un objeto que nos ayuda a controlar flujos de ejecución asincrónicos Loop Callbacks otros deferreds pueden ejecutarse
  • 16. Deferred: Sincrónico: try: resultado = get_data_bloqueante() resultado = procesa_datos(resultado) except Exception, e: resultado = maneja_excepcion(e) Asincrónico: d = get_data() d.addCallback(procesa_datos) d.addErrback(maneja_excepcion)
  • 17. Deferred: class X: Sincrónico: def get_data(self): # lanzo algo que eventualmente # llame a data_ready self.d = Deferred() return self.d def data_ready(self, data): self.d.callback(data) service = X() service.get_data().addCallbacks(callbacks)
  • 18. Deferred: try: guardar_bloqueante(unDato) except Exception, e: print "Algo no anduvo." d = guardar_no_bloqueante(unDato) # retorna enseguida def handle(error): print "Algo no anduvo." d.addErrback(handle)
  • 19. TIP: Es importante encapsular el código Respetar el paradigma orientado a objetos nos ahorra dolores de cabeza: import guitoolkit class Gui: def on_button_click(self, widget): ... def hide_entry1(self): ... class App(): def __init__(self, gui): ... def guardar(self): ... def conseguir_datos(self): ... if __name__ == '__main__': gui_inst = Gui() App(gui_inst) guitoolkit.run()
  • 20. Twisted entra en acción: • Twisted es un framework diseñado para el desarrollo de aplicaciones web; es basado en eventos • Incluye su propio reactor • Este reactor puede ser acoplado con Gtk, Tkinter, PyUI, wxPython • El reactor se puede acoplar a otros frameworks, como PyGame. • Y Qt? Por problemas de licencias no está incluido con el código de twisted, pero se puede descargar por separado http://twistedmatrix.com/trac/wiki/QTReactor Documentación sobre los diferentes reactors: http://twistedmatrix.com/documents/current/core/howto/choos ing-reactor.html
  • 21. Integrando con el toolkit gráfico: from twisted.internet import gtk2reactor # varía dependiendo el toolkit a integrar gtk2reactor.install() # todo tu código # ... from twisted.internet import reactor # arrancamos el reactor de twisted reactor.run() $ python examples/twisted/1.py • ¿Notaron que el código de gtk no cambio y no se rompió nada? • Tambien hay que notar que sigue fallando en el mismo lugar, acordate: ¡Twisted no hace magia!
  • 22. Herramientas que incluye Twisted: Estandariza muchas acciones comunes: • reactor.callLater(segundos, funcion, *args, **kw), Llama a funcion despues de pasados tantos segundos • reactor.callWhenRunning(funcion, *args, **kw), Llama a funcion cuando el reactor empieza a ejecutarse • deferToThread(funcion, *args, **kwargs), Ejecuta funcion en otro thread y retorna un objeto Deferred • @inlineCallbacks, transforma funciones comunes en funciones asincrónicas (para retornar hay que usar returnValue) • Deferred.cancel(), cancelar una tarea en curso dentro de un deferred • deferLater(reactor, segundos, funcion), ejecuta funcion pasados tantos segundos, y retorna un objeto Deferred Y las API's de los diferentes toolkits siguen funcionando, Twisted actua como un plugin.
  • 23. Twisted entra en acción: Reimplementemos los ejemplos usando lo que ya sabemos: $ python examples/twisted/2.1.py $ python examples/twisted/2.2.py # detenible $ python examples/twisted/3.1.py $ python examples/twisted/3.2.py # detenible
  • 24. Caso práctico: Donnees • Tareas asincrónicas • Servidor Web • Base de datos • Gráficos en tiempo real • Threads implementados con Twisted • Envío de e-mail y generación de reportes (podría haber usado twisted.mail.smtp.sendmail) • Tomar datos del puerto serie Repo: https://github.com/maritnvol/Donnees-Acquisition-Data-software $ git clone git@github.com:maritnvol/Donnees-Acquisition- Data-software.git $ cd Donnees-Acquisition-Data-software/Donnees $ python tilapia.py
  • 25. Fuentes: • http://www.artima.com/weblogs/viewpost.jsp?thread=230001 • http://twistedmatrix.com/documents/current/core/howto/process.html • http://www.juanjoconti.com.ar/2010/12/01/videos-de-las-charlas-en-junin • http://python.org.ar/pyar/CharlasAbiertas2010/Twisted • http://krondo.com/blog/?page_id=1327 • http://mumak.net/stuff/twisted-intro.html
  • 26. ¡¡Muchas Gracias!! Happy Coding! ¿¿Preguntas?? Martín Volpe @martinvol http://about.me/MartinVolpe martin.volpe@gmail.com