Foros del Web » Programando para Internet » Python »

como puedo almacenar datos y leer al mismo tiempo

Estas en el tema de como puedo almacenar datos y leer al mismo tiempo en el foro de Python en Foros del Web. Estimados soy nuevo en python , asi que tal vez sea muy básica mi pregunta, pero no lo he logrado. La cuestión es que estoy ...
  #1 (permalink)  
Antiguo 07/09/2014, 19:31
 
Fecha de Ingreso: septiembre-2014
Mensajes: 1
Antigüedad: 9 años, 7 meses
Puntos: 0
como puedo almacenar datos y leer al mismo tiempo

Estimados soy nuevo en python , asi que tal vez sea muy básica mi pregunta, pero no lo he logrado. La cuestión es que estoy haciendo un programa que lee datos de un puerto serial y los almacena en una base de datos (postgresql). El problema que tengo es que logro recibir bien los datos por puerto serial, pero el proceso de enviarlos a la base de datos toma mas tiempo del que me mandan los datos y se me comienza a llenar el buffer del PC. Para evitar este problema se me ocurrió que podría almacenar los datos en alguna especie de memoria y al mismo tiempo ir leyéndolos y guardándolos a la base de datos de forma paralela con la librería THREAD . Pero no se como hacer esto, intente guardar en un txt e ir leyendo en paralelo , pero leo solamente lineas blancas o información defectuosa.

Alguien me podría orientar mas o menos en alguna solución para evitar la perdida de datos.
Saludos y gracias
  #2 (permalink)  
Antiguo 07/09/2014, 22:55
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: como puedo almacenar datos y leer al mismo tiempo

Claro, puedes hacerlo con hacerlo con threads, puedes hacer tu thread pool.

PD1: Threads son una mentira en python.
PD2: Puedes usar multiprocessing y usar 100% todos los CPU que tengas

Aquí te dejo un ejemplo con threads:
Código Python:
Ver original
  1. import time
  2. import threading
  3. import logging
  4. import Queue
  5. import random
  6.  
  7. logger = logging.getLogger(__name__)
  8. logging.basicConfig(level=logging.DEBUG)
  9.  
  10. sentinel = None
  11. queue = Queue.Queue()
  12. num_threads = 5
  13.  
  14. def foobar_task(queue):
  15.     while True:
  16.         n = queue.get()
  17.         logger.info('task called: {n}'.format(n=n))
  18.         if n is sentinel: break
  19.         queue.task_done()
  20.  
  21. threads=[threading.Thread(target=foobar_task,args=(queue,))
  22.          for n in range(num_threads)]
  23. for t in threads:
  24.     t.start()
  25.  
  26. while True:
  27.     n = random.random()
  28.     if n > .999:
  29.         break
  30.     else:
  31.         queue.put(n)
  32.  
  33. queue.join()
  34. for i in range(num_threads):
  35.     queue.put(sentinel)
  36.  
  37. for t in threads:
  38.     t.join()
  39. logger.info("threads are closed")

Y aquí te dejo otro usando multiprocessing:
Código Python:
Ver original
  1. import multiprocessing
  2. import time
  3.  
  4. class Consumer(multiprocessing.Process):
  5.    
  6.     def __init__(self, lock, task_queue, result_queue):
  7.         multiprocessing.Process.__init__(self)
  8.         self.lock = lock
  9.         self.task_queue = task_queue
  10.         self.result_queue = result_queue
  11.  
  12.     def process_safe_print(self, message):
  13.         self.lock.acquire()
  14.         print(message)
  15.         self.lock.release()
  16.  
  17.     def run(self):
  18.         proc_name = self.name
  19.         while True:
  20.             next_task = self.task_queue.get()
  21.             if next_task is None:
  22.                 # Poison pill means shutdown
  23.                 self.process_safe_print('%s: Exiting' % proc_name)
  24.                 self.task_queue.task_done()
  25.                 break
  26.             self.process_safe_print('%s: %s' % (proc_name, next_task))
  27.             answer = next_task()
  28.             self.task_queue.task_done()
  29.             self.result_queue.put(answer)
  30.         return
  31.  
  32.  
  33. class Task(object):
  34.     def __init__(self, a, b):
  35.         self.a = a
  36.         self.b = b
  37.     def __call__(self):
  38.         time.sleep(1) # pretend to take some time to do the work
  39.         return '%s * %s = %s' % (self.a, self.b, self.a * self.b)
  40.     def __str__(self):
  41.         return '%s * %s' % (self.a, self.b)
  42.  
  43.  
  44. if __name__ == '__main__':
  45.     lock = multiprocessing.Lock()
  46.  
  47.     # Establish communication queues
  48.     tasks = multiprocessing.JoinableQueue()
  49.     results = multiprocessing.Queue()
  50.    
  51.     # Start consumers
  52.     num_consumers = multiprocessing.cpu_count() * 2
  53.     print('Creating %d consumers' % num_consumers)
  54.     consumers = [ Consumer(lock, tasks, results)
  55.                   for i in xrange(num_consumers) ]
  56.     for w in consumers:
  57.         w.start()
  58.    
  59.     # Enqueue jobs
  60.     num_jobs = 10
  61.     for i in xrange(num_jobs):
  62.         tasks.put(Task(i, i))
  63.    
  64.     # Add a poison pill for each consumer
  65.     for i in xrange(num_consumers):
  66.         tasks.put(None)
  67.  
  68.     # Wait for all of the tasks to finish
  69.     tasks.join()
  70.     for w in consumers:
  71.         w.join()
  72.    
  73.     # Start printing results
  74.     while num_jobs:
  75.         result = results.get()
  76.         print('Result: %s' % result)
  77.         num_jobs -= 1

Etiquetas: almacenar, gui, tiempo
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




La zona horaria es GMT -6. Ahora son las 00:04.