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
4

3 回答 3

3

Queue 类实现了锁定以防止这种情况发生,请参阅http://docs.python.org/library/queue.html,特别是:

当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。该模块中的 Queue 类实现了所有必需的锁定语义。

所以你不需要任何延迟,队列应该完全按照你的意愿工作。这就是它的目的(基本上):-)

于 2012-05-29T23:12:39.353 回答
2

你的代码是正确的。睡眠没有必要。队列是同步的。存在避免线程拉同一任务的锁。

于 2012-05-29T23:37:00.643 回答
1

queue.Queue 的全部意义在于它为您保证了此属性。不需要睡眠(睡眠从来都不是解决并发故障的好方法)。

于 2012-05-29T23:14:08.103 回答