2012-05-29 2 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을 볼 잠금 구현합니다

그것은 정보가 여러 스레드 사이에 안전하게 교환해야 스레드 프로그래밍에서 특히 유용합니다. 이 모듈의 Queue 클래스는 필요한 모든 잠금 의미를 구현합니다.

지연이 필요하지 않으므로 대기열은 원하는대로 정확하게 작동해야합니다. 그것이 (기본적으로) 쓰여진 것입니다 :-)

1

큐의 전체적인 점 .Queue는 당신에게이 속성을 보장한다는 것입니다. 수면은 필요하지 않습니다 (그리고 수면은 동시성 결함에 대해서는 결코 좋은 방법이 아닙니다).

2

코드가 정확합니다. 수면은 필요하지 않습니다. 대기열은 synchronization입니다. 스레드가 동일한 작업을 수행하지 못하게하는 잠금 장치가 있어야합니다.