2011-09-22 11 views
5

Tengo un programa de Python con varios subprocesos. Cada hilo detecta eventos, que me gustaría guardar en alguna parte para poder leerlos nuevamente (para probar). En este momento, estoy usando Pickle para dar salida a los eventos, y cada hilo da salida a un archivo diferente. Idealmente, solo usaría un archivo de salida y todos los hilos escribirían en él, pero cuando pruebo esto, parece que los diversos hilos intentan escribir su salida al mismo tiempo, y no se guardan en escabecho correctamente. ¿Hay alguna forma de hacer esto?Decapado de varios subprocesos en Python

Respuesta

4

parece un buen lugar para usar un Queue.

  • Haga que todos sus hilos de detección de eventos pongan elementos en una cola compartida.
  • Crea otro hilo para obtener elementos de la cola, y escribe/pickle/lo que sea de este hilo.

de los docs cola:

"El módulo Queue implementa multi-productores, colas múltiples de consumo Se es especialmente útil en la programación roscado cuando la información debe ser intercambiados de forma segura entre varios subprocesos.. La clase Queue en este módulo implementa todas las semánticas de bloqueo necesarias. Depende de la disponibilidad del soporte de subprocesos en Python; consulte el módulo de subprocesamiento . "

2

Sí, con threading.Lock() objetos. Crea un bloqueo antes de crear todos sus subprocesos, se lo da al método que es responsable de guardar/decapado de elementos, y este método debe adquirir el bloqueo antes de escribir en el archivo y soltarlo después.

1

Puede crear un lock y adquirirlo/soltarlo en cada llamada al pickle.dump().

1

El módulo logging tiene un Rlock incorporado en sus manipuladores. Así que podría logging como siempre (simplemente cree un controlador para iniciar sesión en un archivo).

1

Aquí hay un ejemplo usando threading.Lock():

import threading 
import pickle 
picke_lock = threading.Lock() 
    def do(s): 
     picke_lock.acquire() 
     try: 
      ps = pickle.dumps(s) 
     finally: 
      picke_lock.release() 
     return ps 

t1 = threading.Thread(target=do, args =("foo",)) 
t2 = threading.Thread(target=do, args =("bar",)) 
p1 = t1.start() 
p2 = t2.start() 

inpt = raw_input('type anything and click enter... ') 
Cuestiones relacionadas