python3.6 queue模块

python中的queue模块其实是对数据结构中队列这种数据结构的封装,把抽象的数据结构封装成类的属性和方法。这里主要谈下,这些方法。

数据结构基础

栈(stack)也可以说是种先行后出队列(First in Last out),这种数据结构,是先进后出的特点。

打个比方:比如我们把一本一本的书放进一个刚好能容下的桶里面,后放入的书会压着先放入的书。如果我们想要从桶里面取出书籍,那么就只有从后放入的书种先取出来。类似于这种先进后出的模型便是了。

队列(queue)特点是先进先出(First in First out)。

打个比方:我们去食堂排队的时候,总是先去排队的人能够先打到饭,后进入队列排队的人总是后打到饭。这样的数据类型便成为队列。

如果还想学习更多关于数据结构的知识,可以去买本书籍,推荐《大话数据结构》,这本书很浅显易懂的讲解了数据结构的知识。这本书一个大佬也推出了一个配套的教学视频,《小甲鱼数据结构》(上bilibili.com就可以搜索到)。

queue模块中表达队列

在队列中涉及到这样的几个操作:入队(把数据添加到队尾)、出队(从队首取出一个数据)、队列初始化(创建一个队列)、销毁一个队列(把整个队列的数据从内存中删除)、判断队列是否为空判断队列是否满获取队列的长度

python封装好的队列方法

import queue

q = queue.Queue(3)  # 调用构造函数,初始化一个大小为3的队列
print(q.empty())  # 判断队列是否为空,也就是队列中是否有数据
#  入队,在队列尾增加数据, block参数,可以是True和False 意思是如果队列已经满了则阻塞在这里,
# timeout 参数 是指超时时间,如果被阻塞了那最多阻塞的时间,如果时间超过了则报错。
q.put(13, block=True, timeout=5)
print(q.full())  # 判断队列是否满了,这里我们队列初始化的大小为3
print(q.qsize())  # 获取队列当前数据的个数
#  block参数的功能是 如果这个队列为空则阻塞,
#  timeout和上面一样,如果阻塞超过了这个时间就报错,如果想一只等待这就传递None
print(q.get(block=True, timeout=None))

#  queue模块还提供了两个二次封装了的函数,
q.put_nowait(23)  # 相当于q.put(23, block=False)
q.get_nowait()  # 相当于q.get(block=False)

此外,queue模块实现了面向多生产线程、多消费线程的队列。

task_done()
意味着之前入队的一个任务已经完成。由队列的消费者线程调用。每一个get()调用得到一个任务,接下来的task_done()调用告诉队列该任务已经处理完毕。

如果当前一个join()正在阻塞,它将在队列中的所有任务都处理完时恢复执行(即每一个由put()调用入队的任务都有一个对应的task_done()调用)。

join()
阻塞调用线程,直到队列中的所有任务被处理掉。

只要有数据被加入队列,未完成的任务数就会增加。当消费者线程调用task_done()(意味着有消费者取得任务并完成任务),未完成的任务数就会减少。当未完成的任务数降到0,join()解除阻塞。

这两个方法到底怎么用呢?下面我给出两个例子:

import queue

q = queue.Queue(3)
q.put(13, block=True, timeout=5)
q.put_nowait(23)
q.task_done()
print(q.get())
q.join()

这段代码执行完后会一直阻塞着

import queue

q = queue.Queue(3)
q.put(13, block=True, timeout=5)
q.task_done()
q.put_nowait(23)
q.task_done()
print(q.get())
q.join()

这段代码执行后并不会会阻塞着,这是为什么呢?

其实为了实现多线程环境下对队列的支持,当我们调用put的时候可以看做我们给这个队列增加了一个任务,只有到调用task_done()函数是才表示完成了一个任务。而join()函数表示我们所有的任务都完成后才会不被阻塞。

python封装好的栈方法

栈的方法和队列的一模一样,只是有一点不同,我们在调用,put()get()的顺序是不一样的。其他的东西都是和上面队列是一样的。

python封装好的优先队列方法

什么是优先队列
普通的队列其实是:先进后出,或者是先进先出。
但是优先队列就不一样了,它是怎么出的规则不和进入的顺序有关,是和他的优先级有关,当入队的时候我们就会根据这个数据的优先级进行排序,优先级高的就排在前面,然后出队的时候就是先出队。

看这样一个例子:

import queue

q = queue.PriorityQueue(4)
q.put((1,'abcb'))
q.put((1,'abc1'))
q.put((1,'abc3'))
q.put((2,'abc4'))

print(q.get())
print(q.get())
print(q.get())
print(q.get())

这里会根据数据的大小比较进行排序,然后在调用get()时根据优先顺序进行出队列。

python封装好的双向队列方法

可以把双向队列看做是队列和栈的一个升级版。
栈是在一端进行入栈和出站,而队列是在一端入栈一端出栈。
而双向队列则是两端都可以进同时也可以出。

import queue

q = queue.deque(3)  # 初始化一个双向队列
q.append(12)  # 右边进
q.pop()  # 右边出

q.appendleft(34)  # 左边进
q.popleft()  # 左边出

python自己有提供的内存回收机制,所以不需要我们手动销毁队列或者栈

推荐一些好文章

简析Python中的四种队列
每周一个 Python 模块 | Queue
Python Queue 源码解读
Python 多线程|Queue队列|生产者消费者模式|

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 必备的理论基础 1.操作系统作用: 隐藏丑陋复杂的硬件接口,提供良好的抽象接口。 管理调度进程,并将多个进程对硬件...
    drfung阅读 3,535评论 0 5
  • iOS多线程编程 基本知识 1. 进程(process) 进程是指在系统中正在运行的一个应用程序,就是一段程序的执...
    陵无山阅读 6,039评论 1 14
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,752评论 1 17
  • 2018.2.8 唐春桃 忙碌的一天从清晨开始,今天早上开始对家里大清洁,现在刚做完,整整用了一天的时间,家里焕然...
    tangchuntao唐糖阅读 103评论 5 8