Python开发入门到精通--Python数据结构之队列
小职 2021-08-11 来源 :python与大数据分析 阅读 411 评论 0

摘要:本文主要介绍Python开发入门到精通--Python数据结构之队列,通过具体的内容向大家展现,希望对大家Python程序开发的学习有所帮助。

本文主要介绍Python开发入门到精通--Python数据结构之队列,通过具体的内容向大家展现,希望对大家Python程序开发的学习有所帮助。

Python开发入门到精通--Python数据结构之队列


python内置的queue模块实现了三种类型的队列,因此没有必要重复造轮子,它们的区别仅仅是条目取回的顺序。在 FIFO 队列中,先添加的任务先取回。在 LIFO 队列中,最近被添加的条目先取回(操作类似一个堆栈)。优先级队列中,条目将保持排序( 使用 heapq 模块 ) 并且最小值的条目第一个返回。

 

class queue.Queue(maxsize=0)

FIFO 先入先出队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

 

maxsize is an integer that sets the upperbound limit on the number of items that can be placed in the queue.  

class queue.LifoQueue(maxsize=0)

LIFO 后入先出队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

 

class queue.PriorityQueue(maxsize=0)

PriorityQueue优先级队列构造函数。maxsize 是个整数,用于设置可以放入队列中的项目数的上限。当达到这个大小的时候,插入操作将阻塞至队列中的项目被消费掉。如果 maxsize 小于等于零,队列尺寸为无限大。

 

通用方法:

 

Queue.qsize() 返回队列的大致大小

 

Queue.empty() 如果队列为空,返回 True ,否则返回 False 。

 

Queue.full() 如果队列是满的返回 True ,否则返回 False 。

 

Queue.put(item, block=True, timeout=None) 将 item 放入队列。

 

如果可选参数 block 是 true 并且 timeout 是 None (默认),则在必要时阻塞至有空闲插槽可用。

 

如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。

 

反之 (block 是 false),如果空闲插槽立即可用,则把 item 放入队列,否则引发 Full 异常 ( 在这种情况下,timeout 将被忽略)。

 

Queue.put_nowait(item) 相当于 put(item, False) 。

 

Queue.get(block=True, timeout=None) 从队列中移除并返回一个项目。

 

如果可选参数 block 是 true 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。

 

如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。

 

反之 (block 是 false) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。

 

Queue.get_nowait() 相当于 get(False) 。

 

提供了两个方法,用于支持跟踪 排队的任务 是否 被守护的消费者线程 完整的处理。

 

Queue.task_done()

表示前面排队的任务已经被完成。被队列的消费者线程使用。每个 get() 被用于获取一个任务, 后续调用 task_done() 告诉队列,该任务的处理已经完成。

 

如果 join() 当前正在阻塞,在所有条目都被处理后,将解除阻塞(意味着每个 put() 进队列的条目的 task_done() 都被收到)。

 

如果被调用的次数多于放入队列中的项目数量,将引发 ValueError 异常 。

 

Queue.join()

阻塞至队列中所有的元素都被接收和处理完毕。

 

当条目添加到队列的时候,未完成任务的计数就会增加。

 

每当消费者线程调用 task_done() 表示这个条目已经被回收,该条目所有工作已经完成,未完成计数就会减少。

 

当未完成计数降到零的时候, join() 阻塞被解除。

 

代码如下:

 

#!/usr/bin/env python

# -*- coding: UTF-8 -*-

#                     _ooOoo_

#                   o8888888o

#                    88" . "88

#                 ( | -  _  - | )

#                     O\ = /O

#                 ____/`---'\____

#                  .' \\| |// `.

#                 / \\|||:|||// \

#               / _|||||-:- |||||- \

#                | | \\\ - /// | |

#              | \_| ''\---/'' | _/ |

#               \ .-\__ `-` ___/-. /

#            ___`. .' /--.--\ `. . __

#         ."" '< `.___\_<|>_/___.' >'"".

#       | | : `- \`.;`\  _ /`;.`/ - ` : | |

#          \ \ `-. \_ __\ /__ _/ .-` / /

#      ==`-.____`-.___\_____/___.-`____.-'==

#                     `=---='

'''

@Project :pythonalgorithms  

@File :queuedatastructure.py

@Author :不胜人生一场醉

@Date :2021/7/15 1:53  

'''

from queue import Queue, LifoQueue, PriorityQueue, SimpleQueue

import random

 

if __name__ == '__main__':

    q = Queue()  # 先进先出队列

    lq = LifoQueue()  # 先进后厨队列

    pq = PriorityQueue()  # 优先级队列

    sq = SimpleQueue()  # 简单队列

    # 插入队列数据

    for i in range(10):

        q.put(i)

        lq.put(i)

        pq.put(random.randint(1, 20), i)

        sq.put(i)

    for i in range(10):

        print(q.get(), end=' ')

    # 0 1 2 3 4 5 6 7 8 9  

    print('\r')

    for i in range(10):

        print(lq.get(), end=' ')

    # 9 8 7 6 5 4 3 2 1 0  

    print('\r')

    for i in range(10):

        print(pq.get(), end=' ')

    # 6 7 13 16 17 18 18 19 20 20  

    print('\r')

    for i in range(10):

        print(sq.get(), end=' ')

    # 0 1 2 3 4 5 6 7 8 9  

 

    q = Queue(3)

    print('\r')

    print('queue.qsize=', q.qsize())

    # queue.qsize= 0

    print('queue.empty=', q.empty())

    # queue.empty= True

    q.put(5)

    q.put(9)

    q.put(1)

    print('queue.full=', q.full())

    # queue.full= True

    # q.put(10)

    # print(q)

    # q.put(11,block=True,timeout=1)  #在timeout=1秒左右,返回 raise Full

    # print(q)

    # q.put(11, block=False, timeout=1)  # 立刻 返回 raise Full,忽略时间

    # print(q)

输出结果为:

 Python开发入门到精通--Python数据结构之队列


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

Python开发入门到精通--Python数据结构之队列

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程