2012-05-29 34 views
1

我試圖把一個非常簡單的多線程模型放在一起,到目前爲止它似乎工作。我的問題是我怎麼確定兩個線程不會同時從隊列中獲取相同的值,並給我重複?是否有一些內置的方法可以防止這種情況發生?我添加了一個延遲,試圖在每個線程從隊列中獲取值之間放置時間,這是否有必要?多線程時隊列衝突嗎?

from Queue import Queue 
from threading import Thread 
import time 

class myThread(Thread): 
    def __init__(self,queue): 
     Thread.__init__(self) 
     self.queue = queue 
    def run(self):  
     while True:      
      time.sleep(0.0001) #not sure if this is good enough to compensate for overlap in pulling the same value out of a queue   
      task = self.queue.get() #pull a number from the queue, 
      if task != None:   
       out.append(task) #This will be where you   
      else:    
       break 


queue = Queue() 
out = [] 


for i in range(10): 
    t = myThread(queue) 
    t.start() 
for i in range(100): 
    queue.put(i) 
print out 
+1

隊列已經實現了鎖定機制,所以不會發生。 –

回答

3

隊列類實現鎖定,以防止這種情況的發生,參見http://docs.python.org/library/queue.html,特別是:

它是在當信息必須 被安全地多個線程之間交換線程編程特別有用。此 模塊中的隊列類實現了所有必需的鎖定語義。

所以你不需要任何延遲,隊列應該按照你想要的工作。這就是它寫的(基本上):-)

1

queue.Queue的整點是它爲你保證這個屬性。不需要睡眠(睡覺永遠不會是併發故障的好方法)。

2

你的代碼是正確的。睡眠不是必要的。隊列是synchronization。存在一個避免線程執行相同任務的鎖。