Queue 模块``Queue`` 模块提供了一个线程安全的队列 (queue) 实现, 如 [Example 3-2 #eg-3-2] 所示. 你可以通过它在多个线程里安全访问同个对象.====Example 3-2. 使用 Queue 模块====[eg-3-2]```File: queue-example-1.pyimport threadingimport Queueimport time, randomWORKERS = 2class Worker(threading.Thread): def _ _init_ _(self, queue): self._ _queue = queue threading.Thread._ _init_ _(self) def run(self): while 1: item = self._ _queue.get() if item is None: break # reached end of queue # pretend we're doing something that takes 10?00 ms time.sleep(random.randint(10, 100) / 1000.0) print "task", item, "finished"## try itqueue = Queue.Queue(0)for i in range(WORKERS): Worker(queue).start() # start a workerfor i in range(10): queue.put(i)for i in range(WORKERS): queue.put(None) # add end-of-queue markers*B*task 1 finishedtask 0 finishedtask 3 finishedtask 2 finishedtask 4 finishedtask 5 finishedtask 7 finishedtask 6 finishedtask 9 finishedtask 8 finished*b*```[Example 3-3 #eg-3-3] 展示了如何限制队列的大小. 如果队列满了, 那么控制主线程 (producer threads) 被阻塞, 等待项目被弹出 (pop off). ====Example 3-3. 使用限制大小的 Queue 模块====[eg-3-3]```File: queue-example-2.pyimport threadingimport Queueimport time, randomWORKERS = 2class Worker(threading.Thread): def _ _init_ _(self, queue): self._ _queue = queue threading.Thread._ _init_ _(self) def run(self): while 1: item = self._ _queue.get() if item is None: break # reached end of queue # pretend we're doing something that takes 10?00 ms time.sleep(random.randint(10, 100) / 1000.0) print "task", item, "finished"## run with limited queuequeue = Queue.Queue(3)for i in range(WORKERS): Worker(queue).start() # start a workerfor item in range(10): print "push", item queue.put(item)for i in range(WORKERS): queue.put(None) # add end-of-queue markers*B*push 0push 1push 2push 3push 4push 5task 0 finishedpush 6task 1 finishedpush 7task 2 finishedpush 8task 3 finishedpush 9task 4 finishedtask 6 finishedtask 5 finishedtask 7 finishedtask 9 finishedtask 8 finished*b*```你可以通过继承 //Queue// 类来修改它的行为. [Example 3-4 #eg-3-4] 为我们展示了一个简单的具有优先级的队列. 它接受一个元组作为参数, 元组的第一个成员表示优先级(数值越小优先级越高). ====Example 3-4. 使用 Queue 模块实现优先级队列====[eg-3-4]```File: queue-example-3.pyimport Queueimport bisectEmpty = Queue.Emptyclass PriorityQueue(Queue.Queue): "Thread-safe priority queue" def _put(self, item): # insert in order bisect.insort(self.queue, item)## try itqueue = PriorityQueue(0)# add items out of orderqueue.put((20, "second"))queue.put((10, "first"))queue.put((30, "third"))# print queue contentstry: while 1: print queue.get_nowait()except Empty: pass*B*thirdsecondfirst*b*```[Example 3-5 #eg-3-5] 展示了一个简单的堆栈 (stack) 实现 (末尾添加, 头部弹出, 而非头部添加, 头部弹出).====Example 3-5. 使用 Queue 模块实现一个堆栈====[eg-3-5]```File: queue-example-4.pyimport QueueEmpty = Queue.Emptyclass Stack(Queue.Queue): "Thread-safe stack" def _put(self, item): # insert at the beginning of queue, not at the end self.queue.insert(0, item) # method aliases push = Queue.Queue.put pop = Queue.Queue.get pop_nowait = Queue.Queue.get_nowait## try itstack = Stack(0)# push items on stackstack.push("first")stack.push("second")stack.push("third")# print stack contentstry: while 1: print stack.pop_nowait()except Empty: pass*B*thirdsecondfirst*b*```