python中的queue队列类型及函数用法
作者:wcl1800 发布时间:2023-09-04 21:04:01
python queue队列类型及函数
1.队列的种类
Python queue模块的FIFO队列先进先出。 class queue.Queue(maxsize)
LIFO类似于堆,即先进后出。 class queue.LifoQueue(maxsize)
还有一种是优先级队列级别越低越先出来。 class queue.PriorityQueue(maxsize)
import queue
# 先进先出队列
queue_obj = queue.Queue()
for i in range(3):
queue_obj.put(i)
for i in range(3):
print(queue_obj.get())
"""执行结果
0
1
2
"""
# 先进后出队列,类似于堆栈
queue_obj = queue.LifoQueue()
for i in range(3):
queue_obj.put(i)
for i in range(3):
print(queue_obj.get())
"""执行结果
2
1
0
"""
# 优先级队列
import Queue
import threading
class Job(object):
def __init__(self, priority, description):
self.priority = priority
self.description = description
print 'Job:',description
return
def __cmp__(self, other):
return cmp(self.priority, other.priority)
q = Queue.PriorityQueue()
q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))
def process_job(q):
while True:
next_job = q.get()
print 'for:', next_job.description
q.task_done()
workers = [threading.Thread(target=process_job, args=(q,)),
threading.Thread(target=process_job, args=(q,))
]
for w in workers:
w.setDaemon(True)
w.start()
q.join()
2.队列函数
maxsize = 10
queue_obj = queue.Queue(maxsize) # maxsize 代表队列的上限, 如果队列已满, 则插入时需要等待, maxsize为零或负数时.队列没有限制
queue_obj.get(block=True, timeout=None) # block为True时,表示等待获取,直至timeout超时
queue_obj.get_nowait() # 当获取不到元素时,报错
queue_obj.put(item="待插入的元素", block=True, timeout=None) # block为True时,表示等待插入,直至timeout超时
queue_obj.put_nowait('待插入的元素') # 当不能插入元素时报错
queue_obj.empty() # 队列为空时,返回True
queue_obj.full() # 如果队列满时,返回True
queue_obj.task_done() # 在每次获取队列中的元素, 操作完成之后, 调用该函数告诉队列我已经使用完成, 主要是给join函数使用
queue_obj.join() # 等待队列内的元素全部被获取后, 再接触阻塞(直至所有的任务全部task_done)
"""下面的例子验证toask_done和join的关系"""
for i in range(3):
queue_obj.put(i) # 这里像队列中添加三个元素
queue_obj.get() # 这里获取队列中的消息
queue_obj.task_done()
queue_obj.get() # 这里获取队列中的消息
queue_obj.task_done()
queue_obj.get() # 这里获取队列中的消息
queue_obj.task_done()
queue_obj.join()
print('直至队列中的所有元素全部都被取出, join函数才不会阻塞, 如果只执行了两次task_done函数, 则join会一直阻塞')
python 队列类及其方法
1.Python的队列类型
from queue import Queue, LifiQueue, PriorityQueue, SimpleQueue
FIFO
(先入先出)Queue(maxsize=0)
:FIFO队列的构造函数。maxsize是一个整数,用于设置放入队列中数据的上限。一旦达到此大小,插入将被阻塞。如果maxsize<=0,则队列大小为无限。LIFO
(后进先出)LifoQueue(maxsize=0)
:LIFO队列的构造函数,其它同上。优先级队列
PriorityQueue(maxsize=0)
:优先级队列的构造函数,其它同上。SimpleQueue
:FIFO队列的简单形式,缺少诸如任务跟踪之类的高级功能。Empty
:在空对象上调用get()方法,引发的异常队列。Full
:在已满的对象上调用put()方法,引发的异常队列。
2.队列对象(适用Queue、LifoQueue和PriorityQueue)
qsize()
返回队列的大小。
注意qsize()>0不能保证后续的get()不会阻塞,qsize()<maxsize也不能保证对get()的后续调用不会阻塞。
empty()
如果队列是空的返回True,否则返回False。
如果返回True不能保证后续对put()的调用都不会阻塞。如果返回False也不能保证对get()的后续调用不会阻塞。
full()
如果队列满了返回True,否则返回False。
如果返回True不能保证对get()的后续调用不会阻塞。如果full返回False也不能保证后续对put()的调用不会阻塞。
put(item, block=True, timeout=None)
将数据插入队列中。
如果block=True, timeout=None则在必要时进行阻塞,直到队列有空间为止。如果timeout=正数,则它最多超时正数秒。Full队列如果在该时间内没有空间可用,会引发异常。如果block=False,队列有空间,则将数据放入队列(超时被忽略),否则引发Full异常。
put_nowait(item)
等同于put(item, False)。
get(block=True, timeout=None)
从队列中删除并返回一个数据。
如果block=True, timeout=None则在必要时进行阻塞,直到队列有数据为止。如果timeout=正数,则它最多超时正数秒。Empty队列如果在该时间内没有数据可用,会引发异常。如果block=False,队列有数据,则会返回一个数据(超时被忽略),否则引发Empty异常。
get_nowait()
等同于get(False)。
task_done()
表示先前排队的任务已完成。
join()
阻塞直到队列中的所有数据都已获得处理。每当将项目添加到队列时,未完成任务的数量就会增加。每当使用者线程调用task_done()以指示已检索到该项目并且该项目的所有工作完成时,该计数就会减少。当未完成的任务数降至零时,join()取消阻止。
3.SimpleQueue对象
qsize()
empty()
put(item, block = True, timeout = None )
put_nowait(item)
get(block = True,timeout = None)
get_nowait(item)
来源:https://blog.csdn.net/wcl1800/article/details/106478702
猜你喜欢
- 多值运动,也就是对于某个对象来说,不仅仅只是其中一个属性值在变化,而是好多个,比如宽,高,字体,透明度等等同时变化当然了,多值运动会产生一个
- 这是一个简易的员工管理系统,实现最简单的功能:1.登录用户密码验证(错误三次自动退出) 2.支持文本员工的搜索、添加、删除、修改 3.一级层
- numpy.insert()主要用于向矩阵中插入行或列。对于多维矩阵,可以沿任意一个轴插入元素。1. 参数说明numpy.insert(ar
- 观察者模式结构图概念一个"演员"(被观察者),一群"观众"(观察者),一台"摄影机&quo
- Jaslabs的Justin Silverton列出了十条有关优化MySQL查询的语句,我不得不对此发表言论,因为这个清单非常非常糟糕。另外
- 元素浮动导致的问题及解决办法大家都应该很熟悉了,举个简单的例子:<style type="text/css">
- 如题,今天兜兜转转找了很多网站帖子,一个个环节击破,最后装好费了不少时间。希望这个帖子能帮助有需要的人,教你一篇帖子搞定python+num
- 一、home页使用frametemplate/home.html<!DOCTYPE html><html lang=&qu
- base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。它可以把不能作为文本显示的二进制数据编码为可显示的文本信
- 一、 什么是进程 / 线程1、 引论众所周知,CPU是计算机的核心,它承担了所有的计算任务。而操作系统是计算机的管理者,是一个大管家,它负责
- 如果在session级保存一个dictionary对象会降低系统的性能,而在application级保存一个dictionary对象会导致w
- PHP 备份 mysql 数据库的源代码,在完善的 PHP+Mysql 项目中,在后台都会有备份 Mysql 数据库的功能,有了这个功能,对
- go简单代码反汇编用简单的代码用以分析go的调用约定及多返回值的返回方式。package mainfunc vals(c, d int) (
- 我们先看一下淘宝的页面:这么一个庞然大物,该怎么切图呢?显然按照给出的方法也可以完成这项任务,但是做为前端开发的我们是否应该给自己提出更高的
- 今天看到某人博客推荐了http://dragoninteractive.com/这个网站,貌似一些效果做的比较不错,于是打开了看看,不过还真
- 本文实例讲述了ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能。分享给大家供大家参考,具体如下:验证码现在是用户登录、
- 本文实例讲述了Python双链表原理与实现方法。分享给大家供大家参考,具体如下:Python实现双链表文章目录Python实现双链表定义链表
- 本文实例讲述了Python模块的制作方法。分享给大家供大家参考,具体如下:1 目的利用setup.py将框架安装到python环境中,作为第
- js模拟随机抽奖程序代码!相关文章推荐:随机6+1选号码摇奖程序 <html><title>模拟抽奖-asp之家&l
- 前言在python中,print是重要的输出语句,让我们更方便的知道程序的运行状况,但是这样还不够,我们也可以用print来给周围的小伙伴秀