Foros del Web » Programando para Internet » Python »

Recoger la variable de un bucle infinito

Estas en el tema de Recoger la variable de un bucle infinito en el foro de Python en Foros del Web. El planteamiento del problema es el siguiente; Estoy recibiendo el dato GPS que me llega a mi servidor el que me lo muestra es un ...
  #1 (permalink)  
Antiguo 21/09/2011, 13:02
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 8 años, 7 meses
Puntos: 1
Pregunta Recoger la variable de un bucle infinito

El planteamiento del problema es el siguiente;

Estoy recibiendo el dato GPS que me llega a mi servidor
el que me lo muestra es un bucle infinito
cada que llega el dato del gps el lo muestra en pantalla
el dato se guarda en una lista.

La idea es coger la lista en otro script.py sin cerrar el bucle.

Todo eso es porque el script tiene que estar a la escucha permanente de muchos gps.

Alguna idea?
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #2 (permalink)  
Antiguo 21/09/2011, 13:31
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Recoger la variable de un bucle infinito

Depende del alcance de las variables.

De preferencia muestra un ejemplo (código) que simule tu problema.

Por que a ciencia cierta no te puedo decir como lo debes de hacer si no veo como esta estructurado el problema.
  #3 (permalink)  
Antiguo 21/09/2011, 14:57
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 8 años, 7 meses
Puntos: 1
Respuesta: Recoger la variable de un bucle infinito

Cita:
Iniciado por razpeitia Ver Mensaje
Depende del alcance de las variables.

De preferencia muestra un ejemplo (código) que simule tu problema.
Ok aqui te dejo el codigo de ejemplo:
Código:
while 1:
    # recibir data
    data,addr = UDPSock.recvfrom(buf)
    print 'Recibiendo paquete desde %s:%d' % (addr[0], addr[1])
    #imprimir data
    print "Datos Recibidos: ",data
El fina de este ciclo lo que hace es recoger los datos del GPS en "data" y al final los muestra en pantalla, lo que necesito es que el código se quede en infinito para poder quedarme a la espera del dato y poder mandarlo en formato de Lista hacia otro script para procesa el dato.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #4 (permalink)  
Antiguo 21/09/2011, 17:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Recoger la variable de un bucle infinito

Ciertamente la manera mas sencilla sería meter el código que necesites en el while.

Sin embargo puede que sea un proceso delicado y que necesite un buen rendimiento y para eso vas a necesitar programación en paralelo.

La forma mas sencilla de hacer esto es que mandes los datos por un pipe y que otro script los lea y los maneje. Esta técnica se llama pipeline.

En python puedes hacer esto con el modulo subprocess y obviamente haciendo un flush en el while infinito para que mande los datos.
  #5 (permalink)  
Antiguo 21/09/2011, 20:01
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 8 años, 7 meses
Puntos: 1
Pregunta Respuesta: Recoger la variable de un bucle infinito

Cita:
Iniciado por razpeitia Ver Mensaje
Ciertamente la manera mas sencilla sería meter el código que necesites en el while.

Sin embargo puede que sea un proceso delicado y que necesite un buen rendimiento y para eso vas a necesitar programación en paralelo.

La forma mas sencilla de hacer esto es que mandes los datos por un pipe y que otro script los lea y los maneje. Esta técnica se llama [URL="http://en.wikipedia.org/wiki/Pipeline_(Unix)"]pipeline[/URL].

En python puedes hacer esto con el modulo subprocess y obviamente haciendo un flush en el while infinito para que mande los datos.
Pues me dejas un poco confundido, no soy un experto en esto, mire por google y la verdad no se como usarlo, te pido el favor si puedes ayudarme un poco mas a fondo, para entender mejor, estoy arrancando y voy lento.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #6 (permalink)  
Antiguo 21/09/2011, 20:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Recoger la variable de un bucle infinito

Ok a pesar de que el pipeline se puede ajustar muy bien a lo que tu pides también puedes hacer uso de Threads.

Ejemplo de pipeline:
Código Python:
Ver original
  1. #A.py
  2. from time import sleep
  3. import sys
  4.  
  5. for i in xrange(10):
  6.     print i
  7.     sys.stdout.flush()
  8.     sleep(1)

Código Python:
Ver original
  1. #B.py
  2. try:
  3.     while 1:
  4.         a = raw_input()
  5.         print int(a) * 2#Simular alguna operacion
  6. except Exception, e:
  7.     print "Fin del archivo"

Al momento de ejecutarlo en consola (implicando conocimiento previo en linea de comandos)
Solo haces un:
Código:
$ python A.py | python B.py
Ahora si por alguna razón no puedes modificar A.py para meterle el sys.stdout.flush() entonces puedes hacer esto. Ejemplo:
Código Python:
Ver original
  1. #A.py
  2. from time import sleep
  3.  
  4. for i in xrange(10):
  5.     print i
  6.     sleep(1)

Código Python:
Ver original
  1. #B.py
  2. try:
  3.     while 1:
  4.         a = raw_input()
  5.         print int(a) * 2#Simular alguna operacion
  6. except Exception, e:
  7.     print "Fin del archivo"

Código:
$ python -u A.py | python B.py
  #7 (permalink)  
Antiguo 22/09/2011, 00:33
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 8 años, 7 meses
Puntos: 1
Busqueda Respuesta: Recoger la variable de un bucle infinito

Ya mire la documentación y entiendo un poco mas, claro que tengo mis dudas acerca de algunas cosas;

Intente ejecutar los códigos como muestras pero nada, me salen errores:

Código:
# python a.py | python b.py
  File "b.py", line 3
SyntaxError: Non-ASCII character '\xc2' in file b.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
  File "a.py", line 3
SyntaxError: Non-ASCII character '\xc2' in file a.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
que arregle colocando el encoding:

Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-
Luego me sale error de sintaxis:

Código:
python a.py | python b.py
  File "b.py", line 4
    * * while 1:
    ^
SyntaxError: invalid syntax
  File "a.py", line 5
    * * print i
    ^
SyntaxError: invalid syntax
Para el ejemplo que me estas mostrando, no se cual es la variable a exportar? tampoco se a donde cae la variable importada?

También mire el tema 16.6. multiprocessing — Process-based “threading” interface y me interesa la parte de "Queues" y "Pipes" pero como en los ejemplos, no entiendo como un archivo me manda la variable y como el otro la recibe

en Queues, a q se le entrega una lista,q es Queue, p? imprima q, p join?

Código:
from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print q.get()    # prints "[42, None, 'hello']"
    p.join()
en Pipes, a conn.send se le manda una lista, conn.close cerrar, parent_conn? child_conn? = Pipe()? p = Process(target=f, args=(child_conn,))? p.start() iniciar proceso, print parent_conn.recv()? p.join()?

Código:
from multiprocessing import Process, Pipe

def f(conn):
    conn.send([42, None, 'hello'])
    conn.close()

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()
    p = Process(target=f, args=(child_conn,))
    p.start()
    print parent_conn.recv()   # prints "[42, None, 'hello']"
    p.join()
Eso con respecto al flujo de los datos, gracias por tu ayuda y un gran saludo.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #8 (permalink)  
Antiguo 23/09/2011, 00:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Recoger la variable de un bucle infinito

Cita:
Iniciado por diegoug Ver Mensaje
Ya mire la documentación y entiendo un poco mas, claro que tengo mis dudas acerca de algunas cosas;

Intente ejecutar los códigos como muestras pero nada, me salen errores:

Código:
# python a.py | python b.py
  File "b.py", line 3
SyntaxError: Non-ASCII character '\xc2' in file b.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
  File "a.py", line 3
SyntaxError: Non-ASCII character '\xc2' in file a.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
que arregle colocando el encoding:

Código:
#!/usr/bin/python
# -*- coding: utf-8 -*-
Luego me sale error de sintaxis:

Código:
python a.py | python b.py
  File "b.py", line 4
    * * while 1:
    ^
SyntaxError: invalid syntax
  File "a.py", line 5
    * * print i
    ^
SyntaxError: invalid syntax
Parece que tienes errores con el encoding. O al momento de copiar y pegar.


Cita:
Iniciado por diegoug Ver Mensaje
Para el ejemplo que me estas mostrando, no se cual es la variable a exportar? tampoco se a donde cae la variable importada?
No exportas o importas variables propiamente dichas, si no que los datos que mandas en el script A (1, 2, 3) los recibe el script B y procesa (2, 4, 6). Y los 2 corren al mismo tiempo.
Obviamente esta técnica requiere que los datos tengan cierto formato.

En cuanto a los de threading necesitas trabajar con el mismo código del while infinito para poderle meter threads esto ademas que un thread no te da el mismo rendimiento que si lo separas en otro proceso.
  #9 (permalink)  
Antiguo 23/09/2011, 11:33
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 8 años, 7 meses
Puntos: 1
De acuerdo Respuesta: Recoger la variable de un bucle infinito

Muchas gracias por el aporte, ya investigando el tema y mirando los artículos recomendados hoy logre controlar el bucle infinito, me demore un poco ya que pues soy nuevo en python y estoy adaptando a la nueva sintaxis, con el tiempo tomare velocidad.

Te recuerdo que todo este proyecto es de código abierto, seguiré consultándolos, y cuando llegue el momento lo liberare.

ARCHIVO A
Código:
import threading  
  
class MiThread(threading.Thread):  
      def __init__(self, num):  
          threading.Thread.__init__(self)  
          self.num = num  
  
      def run(self):  
          print "Soy el hilo", self.num
ARCHIVO B
Código:
print "Soy el hilo principal"  
  
for i in range(0, 10):  
    t = MiThread(i)  
    t.start()  
    t.join()
Gracias.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #10 (permalink)  
Antiguo 26/09/2011, 20:06
Avatar de diegoug  
Fecha de Ingreso: mayo-2011
Ubicación: Colombia
Mensajes: 52
Antigüedad: 8 años, 7 meses
Puntos: 1
Respuesta: Recoger la variable de un bucle infinito

Tienes razón, me quede corto con threading, porque el ARCHIVO A se ejecuta sobre el ARCHIVO B y esta no es la idea, voy a mejorar la pregunta:

1 .El contexto que estoy usando es Django y la idea en general es que el archivo views.py muestre la variable que se esta recargando constantemente del bucle infinito en el template.

2 .Por otro lado si no es posible entonces haría que el bucle infinito guardara en la base de datos y mandara una señal para que Django mostrara el nuevo dato que entra.

En la terminal estoy haciendo que el bucle infinito corra y en otra terminal tengo corriendo a Django.

Paso de datos entre procesos

El mecanismo de tubería (pipe) estándar permite a un proceso hijo heredar un canal de comunicación con su padre; los datos que se escriben en un extremo de la tubería se leen en el otro. También define un conjunto de servicios para trabajo en red que pueden enviar flujos de datos tanto a procesos locales como remotos.

Hay otro método que es la memoria compartida que ofrece una forma extremadamente rápida de comunicar cantidades grandes o pequeñas de datos; cualquier dato escrito por un proceso en una region de memoria compartida puede ser leído por cualquier otro proceso que haya mapeado dicha region en su espacio de direcciones.

También esta el modulo subprocess.

Otra cosa que me dejo loco en la forma como me mostraste el ejemplo es que no veo los import de la librerias para implementar pipeline

Que puedo hacer? Que me recomiendas? 1 es posible? 2 es posible?

Gracias.
__________________
_________________________
Diego Alonso Uribe Gamez
Twitter: @DiegoUG
  #11 (permalink)  
Antiguo 26/09/2011, 20:53
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 10 meses
Puntos: 1360
Respuesta: Recoger la variable de un bucle infinito

Cita:
Iniciado por diegoug Ver Mensaje
Tienes razón, me quede corto con threading, porque el ARCHIVO A se ejecuta sobre el ARCHIVO B y esta no es la idea, voy a mejorar la pregunta:

1 .El contexto que estoy usando es Django y la idea en general es que el archivo views.py muestre la variable que se esta recargando constantemente del bucle infinito en el template.

2 .Por otro lado si no es posible entonces haría que el bucle infinito guardara en la base de datos y mandara una señal para que Django mostrara el nuevo dato que entra.
Creo que lo que tratas de hacer aquí es un asynchronous request. Esto lo puedes lograr con ajax (javascript + xml)

Etiquetas: multi, procesos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:43.