说明:
队列:
队列类似一条管道,元素put(进),get(出)
队列都是在内存中操作,进程退出,队列情况,且队列是阻塞形态队列分类:
python队列依赖Queue模块
队列 | 方式 |
---|---|
Queue.Queue | 先进先出 |
Queue.LifoQueue | 后进先出 |
queue.PriorityQueue | 优先级队列 |
queue.deque | 双线队列 |
- 队列方法:
方法 | 说明 |
---|---|
put | 往队列中写入数据,默认有block=True和timeout两个参数。当block=True时,写入是阻塞式的,阻塞时间由timeout确定。当队列q被(其他线程)写满后,这段代码就会阻塞,直至其他线程取走数据。Queue.put()方法加上 block=False 的参数,即可解决这个隐蔽的问题。但要注意,非阻塞方式写队列,当队列满时会抛出 exception Queue.Full 的异常 |
get | 取数据(默认阻塞),Queue.get([block[, timeout]])获取队列,timeout等待时间 |
empty | 如果队列为空,返回True,反之False |
qsize | 显示队列中真实存在的元素长度 |
maxsize | 最大支持的队列长度,使用时无括号 |
join | 等到队列为空,再执行别的操作 |
task_done | 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 |
full | 如果队列满了,返回True,反之False |
生产消费模型
用队列将生产者和消费者串起来,使他们无需知道对方状态,只需要往队列中放或取数据,解决程序解耦
import threading
import Queue
import time
import random
#设置队列长度为5
q = Queue.Queue(5)
#定义生产者
def Producer(name):
for i in range(20):
q.put(i)
print "Producer %s put %s"(name,i)
time.sleep(random.randrange(4))
#定义消费者
def Consumer(name):
while True:
data = q.get()
print "Consumer %s get %s"(name,i)
time.sleep(random.randrange(3))
p = threading.Thread(target=Producer,args=("jack",))
c = threading.Thread(target=Consumer,args=("yang",))
p.start()
c.start()