2011-09-22 101 views
5

我有一個多線程的Python程序。每個線程檢測事件,我想將它們存儲在某處,以便我可以再次讀取它們(用於測試)。現在,我使用Pickle輸出事件,並且每個線程輸出到不同的文件。理想情況下,我只會使用一個輸出文件,並且所有線程都會寫入它,但是當我嘗試這樣做時,它看起來像各個線程嘗試同時寫入其輸出,而且它們不會正確地進行pickle。有沒有辦法做到這一點?從Python中的多個線程酸洗

回答

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... ')