2012-08-07 69 views
2

我在我的python程序中有一個列表在某些場合獲取新項目(它是一個消息隊列使用者)。然後,我有一個線程,每隔幾分鐘檢查一次,看看列表中是否有任何內容,如果有,那麼我想對每個項目執行一個操作,然後清空列表。python主線程和子線程之間的原子操作

現在我的問題:我應該使用鎖定以確保子線程中的操作是原子操作,並確保主線程無法在列表中通過列表時更改列表?
或者我應該使用某種標誌?

僞代碼使我的問題更清晰。

的子線程:

def run(self): 
    while 1: 
     if get_main_thread_list() is not empty: 
      do_operations() 
     empty_the_list() 
     sleep(30) 

主線程:

list = [] 

def on_event(item): 
    list.add(item) 

def main(): 
    start_thread() 
    start_listening_to_events() 

我希望這是我的問題更清晰,資源或評論任何環節都顯得歡迎! PS:我很清楚,如果你相信如此,那麼請你花一些時間來解釋我的推理有什麼問題,如果你有時間的話,我可能不會很好地掌握線程編程。

回答

4

我應該使用鎖來確保子線程中的操作是原子操作,並確保主線程無法在列表中通過列表時更改列表嗎?

是的。如果你正確實施它是的。

或者我應該改爲使用某種標誌?

「某種標誌」==鎖,所以你最好使用線程鎖。

重要提示:它看起來像我試圖從stdlib重新實現queue模塊,你可能想看看它。

除了有一堆有趣的功能也被線程安全的:

queue模塊實現多生產,多消費隊列。當信息必須在多個線程之間安全地交換時,它在線程編程中特別有用。該模塊中的Queue類實現了所有必需的鎖定語義。

+1

撇開。如果你想要一個「隊列」,但你不需要線程安全,你可能真的想要['collections.deque'](http://docs.python.org/library/collections.html#collections.deque)而不是'queue.Queue';主要區別在於後者用鎖定來包裝前者 – SingleNegationElimination 2012-08-07 12:03:35

相關問題