我试图组建一个非常简单的多线程模型,到目前为止似乎有效。我的问题是我如何确定两个线程不会同时从队列中获取相同的值并给我重复?是否有一些内置的方法可以防止这种情况?我添加了一个延迟,试图在每个线程从队列中获取值之间设置时间,这是必要的吗?
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
答案 0 :(得分:3)
Queue类实现锁定以防止发生这种情况,请参阅http://docs.python.org/library/queue.html,特别是:
当信息必须时,它在线程编程中特别有用 在多个线程之间安全地交换。这个队列类 module实现了所有必需的锁定语义。
因此您不需要任何延迟,队列应该完全按照您的意愿工作。这就是为(基本上)写的: - )
答案 1 :(得分:2)
您的代码是正确的。睡眠不是必要的。队列是synchronization。存在一个锁定,可以避免线程执行相同的任务。
答案 2 :(得分:1)
队列的整个点.Queue是它为你保证这个属性。不需要睡眠(睡眠永远不是解决并发故障的好方法)。