2012-03-07 88 views
1

在python程序中,我需要2個基於線程模塊的線程。線程#1生成一些數據並將其放入緩衝區,線程#2應該處理緩衝區中的數據。使用線程模塊在python中實現線程

所以我的僞代碼是這樣的: 線程1:

Thread#1 
while True: 
    Generate_Some_Data() 
    while flag==1: 
     pass() 
    Buffer_Address=Write_It_To_Buffer() 
    flag=1 


Thread#2 
while True: 
    while flag==0: 
     pass() 
    Process_Data(Buffer_Address) 
    flag=0 

(我們假設訪問變量「標誌」被霧化,用合適的鎖)

我知道線程模塊不併發。實質上,這意味着除非其中一個線程在某些外部條件(例如file-io或time.sleep)上不阻塞,否則無論任務如何,兩個線程都將共享總處理時間。因此,根據我的理解,在上述配置中,大約一半的處理時間將浪費在「while flag」循環上。

所以,這裏是我的問題:

  1. 我說得對在線程模塊的我上面的期待/理解?在「標誌」循環中浪費了總處理時間的一半嗎?

  2. (如果我是對的)反正有沒有完全擺脫「標誌」循環?我試圖找出另一個可以讓線程在lock.acquire()方法中休眠的結構,但是,我找不到這樣做的安全方法。 (當一個線程relases鎖,沒有quarantee其他線程將收購其同一個線程之前再次獲取它)

回答

3

這聽起來像the Queue module是你所需要的。

這會給你一個阻塞的FIFO隊列。每當消費者線程從隊列中獲取某些內容時,如果內容中沒有任何東西,它將阻塞,直到有東西變爲可用,從而使生產者線程有時間產生某種東西。

如果您擔心生產者線程佔用所有計算週期,則可以對隊列的大小設置限制。如果隊列已滿,並且生產者線程有一些要添加的內容,它將阻塞,直到消費者線程取出某些內容。

下面是一些僞代碼:

import Queue 
q = Queue.Queue() 

# Producer thread 
while True: 
    data = generate_some_data() 
    q.put(data) 

# Consumer thread 
while True: 
    data = q.get() 
    process_data(data) 
+0

我也有一個跟進的問題。 python Queue是一個信號量概念的實現,它假定消費者線程是相同的。假設我有2個消費者線程,它們應該根據數據類型來處理隊列中的數據。例如,讓我們假設如果數據的類型爲「int」,則消費者1必須處理它。如果它是「浮動」,則消費者2必須處理它。但是,如果它是「字符串」,那麼消費者1和2都不應該處理數據。是否有任何編程範例對於實現這樣的問題有用? – tantuni 2012-03-07 18:54:18

+1

@ user460153我只是爲每個消費者製作一個單獨的隊列。 – Taymon 2012-03-07 20:05:15

+0

我認爲「條件變量」是這個問題的一個更好的範例。所有消費者線程都等待主線程發出信號。在主線程發出信號後,每個消費者線程檢查數據類型並決定是處理數據還是繼續休眠。 – tantuni 2012-03-08 18:52:40