Re: [Python-es] Cómo gestionar dos procesos a la vez

2016-08-17 Por tema Carlos Zuniga
2016-08-16 16:25 GMT-05:00 jose antonio via Python-es :
> Saludos
> En el año 2005, jjdelcerromurciano respondió a un mensaje donde explicaba
> cómo ejecutar dos procesos a la vez.
> (https://mail.python.org/pipermail/python-es/2005-May/008573.html)
>
> No sé si seguirá en temas de python, o en el foro, aunque espero que haya
> más suscriptores que puedan ayudarme, y por eso  y me he tomado la libertad
> de escribir por si alguien tiene la amabilidad de solucionarme un problema.
>
> No he trabajado con Python nunca, pero ahora necesito una rutina para un
> proyecto que consiste en un panel informador de premios instalado sobre una
> Raspberry pi, al que se le envía información desde un Pc y se encarga de
> presentarla en una televisión por hdmi. El fondo tiene los textos y marcos
> para que se pueda escribir encima la información enviada.
>
> El problema, según mis pruebas, es que si muestro la ventana, no recibe
> información y si recibe información la muestra en la ventana, pero, si
> cambia, no puedo mostrar más.
>
> Lo he desarrollado con un servidor web y funciona correctamente, pero la
> respuesta entre el envío de la información y su presentación en pantalla es
> muy lenta.  La envío por http al servidor web de la  Raspberry y un programa
> en php genera la página web que se recarga cada segundo.
>
> Quiero que vaya más rápido y he pensado en poner una  ventana con el fondo y
> sobre ella imprimir los valores o  textos a presentar.  Necesito que pueda
> recibir mensajes por socket y presentarlos en la ventana, quedando
> disponible para repetir el proceso hasta el infinito.  He  probado a
> iplementar el código del mensaje de correo relacionado arriba,  pero no he
> conseguido que funcione.
>
> El código de la ventana, sacado de internet, es:
>
> from Tkinter import *
> ventana=Tk()
> ventana.geometry("1024x768+0+0")
> ventana.title("Ventana de pruebas")
> imgl=PhotoImage(file="z:/1.gif")
> lblIimagen=Label(ventana,image=imgl).place(x=0,y=0)
> c=Canvas(ventana,width=1024, height=768)
> c.pack()
> c.create_image(0,0, anchor=NW, image=imgl)
> t=c.create_text(600,195,fill="red", font=("Arial",82),
> text="Python")
> c.itemconfig(t, text="1.000.00")
> ventana.overrideredirect(1) # quita los márgenes
>
> ventana.mainloop()
>
>
> Y el del socket
>
> #!/usr/bin/env python
>
> #importamos el modulo socket
> import socket
>
> #instanciamos un objeto para trabajar con el socket
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>
> #Con el metodo bind le indicamos que puerto debe escuchar y  de que servidor
> esperar conexiones
> #Es mejor dejarlo en blanco para recibir conexiones externas si es nuestro
> caso
> s.bind(("", ))
>
> #Aceptamos conexiones entrantes con el metodo listen, y  ademas aplicamos
> como parametro
> #El numero de conexiones entrantes que vamos a aceptar
> s.listen(1)
>
> #Instanciamos un objeto sc (socket cliente) para recibir datos, al recibir
> datos este
> #devolvera tambien un objeto que representa una tupla con los datos de
> conexion: IP y puerto
> sc, addr = s.accept()
>
>
> while True:
>
>#Recibimos el mensaje, con el metodo recv recibimos datos y como
> parametro
>   #la cantidad de bytes para recibir
>   recibido = sc.recv(1024)
>
>   #Si el mensaje recibido es la palabra close se  cierra la aplicación
>   if recibido == "close":
>  break
>
>   #Si se reciben datos nos muestra la IP y el  mensaje recibido
>   print str(addr[0]) + " dice: ", recibido
>
>  #Devolvemos el mensaje al cliente
>  sc.send(recibido)
> print "Adios."
>
> #Cerramos la instancia del socket cliente y servidor
> sc.close()
> s.close()
>
>
>
> No necesito maravillas. Basta con que el código del servidor socket reciba
> el dato y poder escribirlo en la  ventana abierta.
>
> Con mi agradecimiento por su tiempo, tanto si me responden como si lo borra
> directamente, reciban un cordial saludo.
> José Antonio Gracia
>

Si quieres un ejemplo de algo parecido, tengo un script que utiliza Tk
y un thread que hace requests a una API web cada 5 segundos para
mostrar data (el script es de hace un par de años y la API cambió
luego así que probablemente no funcione, ojo):

https://github.com/charlieman/gw2intel/blob/master/gw2intel.py

Lo que te interesa es la clase Timer que se encarga de llamar a una
función continuamente (update_data), el Queue (data_queue) que guardar
los datos que obtiene de la API y el evento <> que generas
cada vez que se obtiene data y ejecuta una función (update_content)
que actualiza la pantalla en el thread de la GUI.


Saludos
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/


Re: [Python-es] Cómo gestionar dos procesos a la vez

2016-08-17 Por tema Álvaro Justen [Turicas]
Hola, Jose,

En este caso, como es simple, podría utilizar threads -- puede leer
acerca de eso en:

http://www.genbetadev.com/python/multiprocesamiento-en-python-threads-a-fondo-introduccion

Tambien vaya necesitar del uso del threading.Lock, para que una thread
no cambie datos de otra al mismo tiempo en que la otra utiliza estos
datos.

Saludos,
 Álvaro Justen "Turicas"
   http://turicas.info/ http://twitter.com/turicas
   http://CursoDeArduino.com.br/ http://github.com/turicas
   +55 21 9 9898-0141


2016-08-16 18:25 GMT-03:00 jose antonio via Python-es :
> Saludos
> En el año 2005, jjdelcerromurciano respondió a un mensaje donde explicaba
> cómo ejecutar dos procesos a la vez.
> (https://mail.python.org/pipermail/python-es/2005-May/008573.html)
>
> No sé si seguirá en temas de python, o en el foro, aunque espero que haya
> más suscriptores que puedan ayudarme, y por eso  y me he tomado la libertad
> de escribir por si alguien tiene la amabilidad de solucionarme un problema.
>
> No he trabajado con Python nunca, pero ahora necesito una rutina para un
> proyecto que consiste en un panel informador de premios instalado sobre una
> Raspberry pi, al que se le envía información desde un Pc y se encarga de
> presentarla en una televisión por hdmi. El fondo tiene los textos y marcos
> para que se pueda escribir encima la información enviada.
>
> El problema, según mis pruebas, es que si muestro la ventana, no recibe
> información y si recibe información la muestra en la ventana, pero, si
> cambia, no puedo mostrar más.
>
> Lo he desarrollado con un servidor web y funciona correctamente, pero la
> respuesta entre el envío de la información y su presentación en pantalla es
> muy lenta.  La envío por http al servidor web de la  Raspberry y un programa
> en php genera la página web que se recarga cada segundo.
>
> Quiero que vaya más rápido y he pensado en poner una  ventana con el fondo y
> sobre ella imprimir los valores o  textos a presentar.  Necesito que pueda
> recibir mensajes por socket y presentarlos en la ventana, quedando
> disponible para repetir el proceso hasta el infinito.  He  probado a
> iplementar el código del mensaje de correo relacionado arriba,  pero no he
> conseguido que funcione.
>
> El código de la ventana, sacado de internet, es:
>
> from Tkinter import *
> ventana=Tk()
> ventana.geometry("1024x768+0+0")
> ventana.title("Ventana de pruebas")
> imgl=PhotoImage(file="z:/1.gif")
> lblIimagen=Label(ventana,image=imgl).place(x=0,y=0)
> c=Canvas(ventana,width=1024, height=768)
> c.pack()
> c.create_image(0,0, anchor=NW, image=imgl)
> t=c.create_text(600,195,fill="red", font=("Arial",82),
> text="Python")
> c.itemconfig(t, text="1.000.00")
> ventana.overrideredirect(1) # quita los márgenes
>
> ventana.mainloop()
>
>
> Y el del socket
>
> #!/usr/bin/env python
>
> #importamos el modulo socket
> import socket
>
> #instanciamos un objeto para trabajar con el socket
> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>
> #Con el metodo bind le indicamos que puerto debe escuchar y  de que servidor
> esperar conexiones
> #Es mejor dejarlo en blanco para recibir conexiones externas si es nuestro
> caso
> s.bind(("", ))
>
> #Aceptamos conexiones entrantes con el metodo listen, y  ademas aplicamos
> como parametro
> #El numero de conexiones entrantes que vamos a aceptar
> s.listen(1)
>
> #Instanciamos un objeto sc (socket cliente) para recibir datos, al recibir
> datos este
> #devolvera tambien un objeto que representa una tupla con los datos de
> conexion: IP y puerto
> sc, addr = s.accept()
>
>
> while True:
>
>#Recibimos el mensaje, con el metodo recv recibimos datos y como
> parametro
>   #la cantidad de bytes para recibir
>   recibido = sc.recv(1024)
>
>   #Si el mensaje recibido es la palabra close se  cierra la aplicación
>   if recibido == "close":
>  break
>
>   #Si se reciben datos nos muestra la IP y el  mensaje recibido
>   print str(addr[0]) + " dice: ", recibido
>
>  #Devolvemos el mensaje al cliente
>  sc.send(recibido)
> print "Adios."
>
> #Cerramos la instancia del socket cliente y servidor
> sc.close()
> s.close()
>
>
>
> No necesito maravillas. Basta con que el código del servidor socket reciba
> el dato y poder escribirlo en la  ventana abierta.
>
> Con mi agradecimiento por su tiempo, tanto si me responden como si lo borra
> directamente, reciban un cordial saludo.
> José Antonio Gracia
>
>
> ___
> Python-es mailing list
> Python-es@python.org
> https://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
___
Python-es mailing list
Python-es@python.org
https://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/