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
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 . "
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.
È possibile creare un numero lock e acquistarlo/rilasciarlo attorno ad ogni chiamata su pickle.dump()
.
Il modulo logging ha un Rlock
incorporato nei relativi gestori. Quindi è possibile logging
come normale (basta creare un gestore per accedere a un file.)
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... ')
- 1. decapaggio garbo-degradanti in Python
- 2. Informazioni sul decapaggio in Python
- 3. Registrazione di Python da più thread
- 4. Python, cPickle, funzioni lambda decapaggio
- 5. Decapaggio in stile Python per C++?
- 6. Calling accetta() da più thread
- 7. StringBuilder modificato da più thread
- 8. Chiamare Console.WriteLine da più thread
- 9. Osservabile da Futures - onNext da più thread
- 10. Decapaggio cv2.KeyPoint causa PicklingError
- 11. tratti dinamici non sopravvivono decapaggio
- 12. thread vs. process in Python
- 13. loop in più thread
- 14. È int sicuro leggere da più thread?
- 15. Thread Python in Python incorporato: come?
- 16. Sincronizzazione più thread in pitone
- 17. Passare più argomenti da bash in python
- 18. Decapaggio di un grafico con cicli
- 19. Come interrompere un socket.recv() da un altro thread in Python
- 20. Elaborazione di un singolo file da più processi in python
- 21. Scrittura su un singolo file da più thread in ruby
- 22. SELECT ... FOR UPDATE da una tabella in più thread
- 23. Python, thread e gobject
- 24. Attendere più thread (thread Posix, C++)
- 25. Unire thread interrompibile in Python
- 26. Thread permutazioni Python
- 27. Dump thread Python
- 28. Verificare se il thread corrente è thread principale, in Python
- 29. Più thread e memoria
- 30. Python 2.7: Stampa thread safe