2011-09-22 15 views
5

Ho un programma python con più thread. Ogni thread rileva eventi, che vorrei memorizzare da qualche parte in modo da poterli leggere di nuovo (per testare). In questo momento, sto usando Pickle per produrre gli eventi, e ogni thread esce su un file diverso. Idealmente, userei solo un file di output e tutti i thread ci scriverebbero, ma quando lo provo, sembra che i vari thread provino a scrivere l'output nello stesso momento e non vengano decapitati correttamente. C'è un modo per fare questo?Decapaggio da più thread in Python

risposta

4

sembra un buon posto per utilizzare un Queue.

  • Tutti i thread di rilevamento eventi inseriscono elementi in una coda condivisa.
  • Creare un altro thread per ottenere elementi dalla coda e scrivere/pickle/qualsiasi cosa da questo thread.

dalla documentazione coda:

"Il modulo Queue implementa multi-produttori, code multi-consumo E è particolarmente utile nella programmazione filettato quando le informazioni devono essere scambiati in modo sicuro tra più thread.. La classe Queue in questo modulo implementa tutte le semantiche di blocco richieste, dipende da la disponibilità del supporto thread in Python, vedere il modulo di threading . "

2

Sì, con oggetti threading.Lock(). Si crea un blocco prima di creare tutti i thread, lo si assegna al metodo responsabile del salvataggio/decapaggio degli elementi e questo metodo deve acquisire il blocco prima di scrivere nel file e rilasciarlo dopo.

1

È possibile creare un numero lock e acquistarlo/rilasciarlo attorno ad ogni chiamata su pickle.dump().

1

Il modulo logging ha un Rlock incorporato nei relativi gestori. Quindi è possibile logging come normale (basta creare un gestore per accedere a un file.)

1

Ecco un esempio di utilizzo 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... ')