问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python Queue 入门

发布网友 发布时间:2022-10-01 13:16

我来回答

1个回答

热心网友 时间:2023-01-23 16:25

Queue 叫队列,是数据结构中的一种,基本上所有成熟的编程语言都内置了对 Queue 的支持。

Python 中的 Queue 模块实现了多生产者和多消费者模型,当需要在多线程编程中非常实用。而且该模块中的 Queue 类实现了锁原语,不需要再考虑多线程安全问题。

该模块内置了三种类型的 Queue,分别是 class queue.Queue(maxsize=0) , class queue.LifoQueue(maxsize=0) 和 class queue.PriorityQueue(maxsize=0) 。它们三个的区别仅仅是取出时的顺序不一致而已。

Queue 是一个 FIFO 队列,任务按照添加的顺序被取出。

LifoQueue 是一个 LIFO 队列,类似堆栈,后添加的任务先被取出。

PriorityQueue 是一个优先级队列,队列里面的任务按照优先级排序,优先级高的先被取出。

如你所见,就是上面所说的三种不同类型的内置队列,其中 maxsize 是个整数,用于设置可以放入队列中的任务数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的任务被消费掉。如果 maxsize 小于等于零,则队列尺寸为无限大。

向队列中添加任务,直接调用 put() 函数即可

put() 函数完整的函数签名如下 Queue.put(item, block=True, timeout=None) ,如你所见,该函数有两个可选参数。

默认情况下,在队列满时,该函数会一直阻塞,直到队列中有空余的位置可以添加任务为止。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有空余的位置出来,则会引发 Full 异常。

当 block 为 false 时,timeout 参数将失效。同时如果队列中没有空余的位置可添加任务则会引发 Full 异常,否则会直接把任务放入队列并返回,不会阻塞。

另外,还可以通过 Queue.put_nowait(item) 来添加任务,相当于 Queue.put(item, False) ,不再赘述。同样,在队列满时,该操作会引发 Full 异常。

从队列中获取任务,直接调用 get() 函数即可。

与 put() 函数一样, get() 函数也有两个可选参数,完整签名如下 Queue.get(block=True, timeout=None) 。

默认情况下,当队列空时调用该函数会一直阻塞,直到队列中有任务可获取为止。如果 timeout 是正数,则最多阻塞 timeout 秒,如果这段时间内还没有任务可获取,则会引发 Empty 异常。

当 block 为 false 时,timeout 参数将失效。同时如果队列中没有任务可获取则会立刻引发 Empty 异常,否则会直接获取一个任务并返回,不会阻塞。

另外,还可以通过 Queue.get_nowait() 来获取任务,相当于 Queue.get(False) ,不再赘述。同样,在队列为空时,该操作会引发 Empty 异常。

Queue.qsize() 函数返回队列的大小。注意这个大小不是精确的,qsize() > 0 不保证后续的 get() 不被阻塞,同样 qsize() < maxsize 也不保证 put() 不被阻塞。

如果队列为空,返回 True ,否则返回 False 。如果 empty() 返回 True ,不保证后续调用的 put() 不被阻塞。类似的,如果 empty() 返回 False ,也不保证后续调用的 get() 不被阻塞。

如果队列是满的返回 True ,否则返回 False 。如果 full() 返回 True 不保证后续调用的 get() 不被阻塞。类似的,如果 full() 返回 False 也不保证后续调用的 put() 不被阻塞。

queue.Queue() 是 FIFO 队列,出队顺序跟入队顺序是一致的。

queue.LifoQueue() 是 LIFO 队列,出队顺序跟入队顺序是完全相反的,类似于栈。

优先级队列中的任务顺序跟放入时的顺序是无关的,而是按照任务的大小来排序,最小值先被取出。那任务比较大小的规则是怎么样的呢。

注意,因为列表的比较对规则是按照下标顺序来比较的,所以在没有比较出大小之前 ,队列中所有列表对应下标位置的元素类型要一致。

好比 [2,1] 和 ["1","b"] 因为第一个位置的元素类型不一样,所以是没有办法比较大小的,所以也就放入不了优先级队列。

然而对于 [2,1] 和 [1,"b"] 来说即使第二个元素的类型不一致也是可以放入优先级队列的,因为只需要比较第一个位置元素的大小就可以比较出结果了,就不需要比较第二个位置元素的大小了。

但是对于 [2,1] 和 1 [2,"b"] 来说,则同样不可以放入优先级队列,因为需要比较第二个位置的元素才可以比较出结果,然而第二个位置的元素类型是不一致的,无法比较大小。

综上,也就是说, 直到在比较出结果之前,对应下标位置的元素类型都是需要一致的

下面我们自定义一个动物类型,希望按照年龄大小来做优先级排序。年龄越小优先级越高。

本章节介绍了队列以及其常用操作。因为队列默认实现了锁原语,因此在多线程编程中就不需要再考虑多线程安全问题了,对于程序员来说相当友好了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
哪些网站可以找到更好的ppt配图? 有哪些“免费”的ppt模板,图片素材的网站? 推荐点梁汉文的好歌 梁汉文好听的经典歌 哲理词句大全精选278句 微信名字最好听527个 面试没过可以再争取话术 面试后被拒绝了如何重新争取 面试复试没通过还能争取吗 3d定制女仆2电脑配置这个配置能玩3D定制女仆2么不行的话需要换什么 老子中的成语 老子中的成语有哪些 给朋友留言的暖心句子简短 写给朋友的话暖心 朋友留言暖心长句子 给好朋友的空间留言暖心句子 朋友留言的暖心话 有哪些很暖心的句子 给朋友留言的暖心句子 给朋友留言的暖心句子有哪些 泰迪吃三文鱼油有什么好 狗狗吃三文鱼的好处和坏处 《我是大反派[快穿]》txt下载在线阅读全文,求百度网盘云资源 《我靠美食征服了反派大佬》txt下载在线阅读全文,求百度网盘云资源 ...本言情小说名字,番外是女主的奴婢和男主的护法在一起了?_百度... 《大美食家》txt下载在线阅读全文,求百度网盘云资源 《反派大美食家》txt下载在线阅读全文,求百度网盘云资源 狗狗可以吃三文鱼吗(狗狗可以吃三文鱼吗罐头) 请问告诫的近义词是什么?谢谢 梦见花椒有什么征兆 睡觉梦见花椒 杨桃可以怎么吃 杨桃的吃法 杨桃怎么个吃法 杨桃吃法有哪些 怎么挑选活的生蚝 新鲜生蚝怎么挑选 老母鸡的介绍 花生酱的如何制作 花生酱怎么做 钦州龙门群岛旅游区怎样 钦州龙门群岛旅游区如何 从钦州到茅尾海怎么走 钦州龙门群岛旅游区怎样? 钦州龙门群岛旅游区如何? 三万五千伏配电柜内有呲呲呲的响声危险吗? 华为watchfitnew怎么连接手机 电箱滋滋响怎么回事? 怎么做望眼欲穿的青椒肉丝打卤面 青椒肉丝打卤面做法步骤 如何恢复Windows 2003的网络连接和上网功能? 释迦牟尼佛首摆放室内好吗? 为什么很多人家里喜欢摆佛首 能不能用四面佛首做茶宠 个性八月再见的文案 个性八月再见的文案有哪些 用水泡米饭吃有危险吗? 请问下,怎么建立网吧共享的? 腾讯网吧特权可以共享吗 徐州共享网吧问题 家里能共享网吧的网络吗?? 徐州市共享网吧的具体位置