我们今天将会通过Python同步队列的相关介绍,来详细分析一下这一编程语言中的多线程应用。希望对此又需要的朋友们可以通过本文介绍的内容充分的掌握这一应用技巧,以方便将来的实际应用。#t#
我们经常会采用生产者/消费者关系的两个线程来处理一个共享缓冲区的数据。例如一个生产者线程接受用户数据放入一个共享缓冲区里,等待一个消费者线程对数据 取出处理。但是如果缓冲区的太小而生产者和消费者两个异步线程的速度不同时,容易出现一个线程等待另一个情况。为了尽可能的缩短共享资源并以相同速度工作 的各线程的等待时间,我们可以使用一个“队列”来提供额外的缓冲区。
创建一个“队列”对象
- import Queue
- myqueue = Queue.Queue(maxsize = 10)Queue.Queue
类即是一个队列的同步实现。队列长度可为无限或者有限。可通过Queue的构造函数的可选参数maxsize来设定队列长度。如果maxsize小于1就表示队列长度无限。
将一个值放入队列中
- myqueue.put(10)
调用队列对象的put()方法在队尾插入一个项目。put()有两个参数,第一个item为必需的,为插入项目的值;第二个block为可选参数,默认为1。如果队列当前为空且block为1,put()方法就使调用线程暂停,直到空出一个数据单元。如果block为0,put方法将引发Full异常。
将一个值从队列中取出
- myqueue.get()
调用队列对象的get()方法从队头删除并返回一个项目。可选参数为block,默认为1。如果队列为空且block为1,get()就使调用线程暂停,直至有项目可用。如果block为0,队列将引发Empty异常。
我们用一个Python同步队列例子来展示如何使用Queue# queue_example.py
- from Queue import Queue
- import threading
- import random
- import time
- # Producer thread
- class Producer(threading.Thread):
- def __init__(self, threadname, queue):
- threading.Thread.__init__(self, name = threadname)
- self.sharedata = queue
- def run(self):
- for i in range(20):
- print self.getName(),’adding’,i,’to queue’
- self.sharedata.put(i)
- time.sleep(random.randrange(10)/10.0)
- print self.getName(),’Finished’
- # Consumer thread
- class Consumer(threading.Thread):
- def __init__(self, threadname, queue):
- threading.Thread.__init__(self, name = threadname)
- self.sharedata = queue
- def run(self):
- for i in range(20):
- print self.getName(),’got a value:’,self.sharedata.get()
- time.sleep(random.randrange(10)/10.0)
- print self.getName(),’Finished’
- # Main thread
- def main():
- queue = Queue()
- producer = Producer(’Producer’, queue)
- consumer = Consumer(’Consumer’, queue)
- print ‘Starting threads …’
- producer.start()
- consumer.start()
- producer.join()
- consumer.join()
- print ‘All threads have terminated.’
- if __name__ == ‘__main__’:
- main()
Python同步队列示例代码中实现了两个类:生产者类Producer和消费者类Consumer。前者在一个随机的时间内放入一个值到队列queue中然后显示出来,后者在一定随机的时间内从队列queue中取出一个值并显示出来。