我有一個多線程的Python程序。每個線程檢測事件,我想將它們存儲在某處,以便我可以再次讀取它們(用於測試)。現在,我使用Pickle輸出事件,並且每個線程輸出到不同的文件。理想情況下,我只會使用一個輸出文件,並且所有線程都會寫入它,但是當我嘗試這樣做時,它看起來像各個線程嘗試同時寫入其輸出,而且它們不會正確地進行pickle。有沒有辦法做到這一點?從Python中的多個線程酸洗
5
A
回答
4
看起來像是一個使用Queue
的好地方。
- 讓您的所有事件檢測線程都將項目置於共享隊列中。
- 創建另一個線程從隊列中獲取項目,並從該線程寫入/ pickle /任何內容。
從隊列文檔:
「的隊列模塊實現多生產者,多消費者隊列它 是在線程編程特別有用的,當信息必須 多個線程之間安全地交換。這個 模塊中的Queue類實現了所有需要的鎖定語義,它取決於 Python中線程支持的可用性;請參閱線程 模塊。
2
是的,與threading.Lock()對象。 在創建所有線程之前創建一個鎖,將其提供給負責保存/清理項目的方法,並且此方法應在寫入文件並釋放之前獲取鎖定。
1
您可以創建lock並在每次致電pickle.dump()
時獲取/釋放它。
1
logging模塊的內置於其處理程序中。因此,您可以像平常一樣logging
(只需創建一個處理程序即可登錄文件。)
1
下面是一個例子使用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. 的Python酸洗
- 2. Python酸洗問題
- 3. Python字典酸洗
- 4. Python中酸洗錯誤?
- 5. 在Python中瞭解酸洗
- 6. EOF Python中酸洗錯誤
- 7. Python的酸洗槽錯誤
- 8. Python酸洗字典EOFError
- 9. 酸洗增強python函數
- 10. 酸洗的OrderedDict
- 11. 在SWI Prolog中等效的Python酸洗?
- 12. 在Python中酸洗數據時的MemoryError
- 13. 在Python中酸洗時發生EOFError
- 14. 在Python中酸洗錯誤:io.UnsupportedOperation:讀
- 15. 酸洗對象
- 16. 酸洗AppEngine上
- 17. 酸洗數據
- 18. 酸洗一個類定義
- 19. 酸洗靜態方法 - Python的
- 20. Python:酸洗模塊的替代品
- 21. 的Python酸洗變量只有在超
- 22. Python的酸洗錯誤嘗試醃製
- 23. 從酸洗多個對象到鍵值存儲的任何值?
- 24. 從Python中酸洗排除對象的字段
- 25. 如何使用python多線程並行處理另一個模塊的某個函數而不進行酸洗?
- 26. 如何避免酸洗字典VS酸洗列表的處罰
- 27. 酸洗類方法
- 28. 酸洗使用defaultdict
- 29. 酸洗內部類
- 30. python-3.x酸洗創建空文件