python学习之队列(Queue)

队列模块是继承multi-producer,multi-consumer queues。它经常被用作处理线程操作,比如要进行多线程之间通信时。

队列有三种类型,这种不同体现在检索顺序上。这三种分别为FIFO队列、LIFO队列(它更像我们所说的栈)和优先级队列。FIFO队列是先进先出;LIFO队列是后进先出;优先级队列是依据元素用优先级的大小排序,然后采用先进先出的原则。他们的容器大小依据放置在容器内元素的数量而定。

以下给出使用的例子:

FIFO队列:

q = Queue.Queue()

for i in range(5):
    q.put(i)

while not q.empty():
    print q.get()

运行结果:
这里写图片描述

LIFO队列:

q = Queue.LifoQueue()

for i in range(5):
    q.put(i)

while not q.empty():
    print q.get()

运行结果:
这里写图片描述

优先级队列:

class students:
    def __init__(self, name, age, id):
        self.name = name
        self.age = age
        self.id = id

    def __cmp__(self, other):
        return  cmp(self.id, other.id);

q = Queue.PriorityQueue()

q.put(students('mcc', 19, 9))
q.put(students('ccm', 18, 5))
q.put(students('cmc', 16, 8))

while not q.empty():
    student = q.get()
    print '姓名: %s 年龄: %s 学号:%s'%(student.name, student.age, student.id)

运行结果:
这里写图片描述

最后介绍一些常用的方法

task_done():
表示之前的入队的任务已经完成。由队列的消费者调用。每一个get()调用一个任务,接下来的task_done()调用告诉队列该任务己经处理完成。如果当一个join()正在阻塞,它将在队列中所有任务执行完毕后调用执行,每一个put()调用入队任务都有一个对应的task_done()调用。

join()
阻塞调用线程,直到队列中所有任务被处理掉。只要还有数据未入队,未完成的数量就会增加。当消费者线程调用task_done(),就意味者消费者的任务完成,未完的数目就会减少。当未完成数量减少到0时,阻塞解除。

put(item[,block[,timeout]])

将item放入队列中。如果可选参数为block为True且timeout为空的对象时,默认情况为阻塞调用,无超时。timeout代表阻塞调用进程的时间,如果一直无空空间可用,就抛出Full异常。如果block为False,如果有空闲空间可用讲数据放入队列,否则立即抛出Full异常。它的非阻塞版本为put_nowait()方法。

get(block[block[,timeout]])
从队列中移除并返回一个数据。block以及timeout参数同put方法相同。它的非阻塞版本为get_nowait()方法。

empty()
如果队列为空,返回True,反之返回False。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值