Python 队列

一、分类

1. Queue

标准队列,先进先出(FIFO),队尾插入,队头取元素。

2. LifoQueue

后进先出(first in last out)。与栈的类似

3. PriorityQueue

优先级队列,队列内的元素有次序之分,优先级越大,排队时间越短

二、常用方法

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

往队列中放数据,

  • 如果可选的参数block为True且timeout为空对象(默认的情况,阻塞调用,无超时)。
  • 如果timeout是个正整数,阻塞调用进程最多timeout秒,如果一直无空空间可用,抛出Full异常(带超时的阻塞调用)。
  • 如果block为False,如果有空闲空间可用将数据放入队列,否则立即抛出Full异常
  • 其非阻塞版本为put_nowait等同于put(item, False)

2. get([block[, timeout]])

从队列中移除并返回一个数据。block 跟 timeout 参数同put方法

其非阻塞方法为 get_nowait() 相当与 get(False)

3. task_done()

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

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

4. join()

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

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

三、应用场景

1. 背景

某 Python 系统中,某一时间需要处理批量的大文件,IO吞吐增大,且需要把数据传回 Java 后端系统,但是因为网络传输压力太大,导致网络连接常常摆烂,想着使用队列缓解一下压力。

2. 实现代码

使用哪种队列不是重点,代码实现逻辑都是一样的,只是消费顺序不一样罢了

import threading
import queue
import time
import datetimeupload_queue = queue.Queue(maxsize=2 << 9)def producer():"""模拟生成需要处理的数据:return: """count = 1while True:msg = "消息编号:{}".format(count)upload_queue.put(msg)count += 1if count % 10 == 0:print("即将睡眠 10 s")time.sleep(10)def consumer():"""队列消费者,逐条消费:return: """while True:msg = upload_queue.get()print(datetime.datetime.today())print("上传队列中有消息个数:{}".format(upload_queue.qsize()))print("接收到 =====>>>>> {}".format(msg))time.sleep(1)upload_queue.task_done()if __name__ == '__main__':# 设置线程,让他们之间形成生产 - 消费的闭环t1 = threading.Thread(target=producer, args=[])t1.start()t2 = threading.Thread(target=consumer, args=[])t2.start()

Python 队列 queue相关推荐

  1. Python队列Queue

    Python队列Queue Queue是python标准库中的线程安全的队列(FIFO),提供了一个多线程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递. 常见方法 1.put( ...

  2. python队列queue不堵塞_python 队列(queue)阻塞

    背景:python 队列 queue.Queue 或 multiprcessing.Queue 或其他队列在写入队列或从队列中读取元素时,都有可能会发生线程阻塞. 下面来说一下阻塞的类型,然后怎么避免 ...

  3. Python|队列Queue

    一 前言 本文算是一次队列的学习笔记,Queue 模块实现了三种类型的队列,它们的区别仅仅是队列中元素被取回的顺序.在 FIFO 队列中,先添加的任务先取回.在 LIFO 队列中,最近被添加的元素先取 ...

  4. python队列queue不堵塞_python队列Queue

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  5. python队列Queue的详解

    Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信. 1. Queue的使用 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个 ...

  6. Python队列Queue详解,超详细

    Queue queue模块简介 queue.Queue(maxsize=0) queue.LifoQueue(maxsize=0) queue.PriorityQueue(maxsize=0) que ...

  7. python queue 查询是否在队列中_python队列Queue的详解

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  8. python队列只能一个个读取吗_python队列Queue的详解

    Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 基本FIFO队列 clas ...

  9. python queue put阻塞_python 队列(queue)阻塞

    背景:python 队列 queue.Queue 或 multiprcessing.Queue 或其他队列在写入队列或从队列中读取元素时,都有可能会发生线程阻塞. 下面来说一下阻塞的类型,然后怎么避免 ...

最新文章

  1. 线上直播丨KDD 2021预训练Workshop,谷歌MSRA等5位顶尖研究者参与研讨
  2. 软件设计是怎样炼成的(6)——打造系统的底蕴(数据库设计)(上篇)
  3. 11月数据库排行:PostgreSQL起飞、三巨头分数持续低迷
  4. python opencv检测人脸
  5. spring boot(一)创建项目
  6. Python之区块链入门,揭秘比特币
  7. 3.1.3 操作系统覆盖技术与交换技术的思想
  8. Redis详解(三)——Redis持久化
  9. js事件的冒泡(bubble)机制说明
  10. 托马斯微积分 从入门到失望
  11. 细菌感染和抗生素使用
  12. Win10-64位上编译CodeLite13.0.0源码
  13. vue vue-element-ui组件 eltable 表头背景颜色
  14. 学透for循环-传统for循环与增强for循环
  15. JAVA 九大排序算法
  16. b站python弹幕签到_B站弹幕实时效果python
  17. 语音科学计算机,CalcVoice(语音科学计算器)
  18. 时区(Timezone)一览表
  19. 讲情怀的韦晓亮和他的科技教育因果论
  20. 维克森林大学计算机专业,维克森林大学研究生读几年?

热门文章

  1. leetcode649.Dota2参议院
  2. js解析MarkDown语法
  3. Windows 文件共享功能用法
  4. 微服务设计指导-实践springcloud+springboot+nacos+feign+hytrix
  5. 归一法的计算方法讲解_第七讲 归一法
  6. 云原生全景图详解系列:带你了解云原生技术图谱
  7. [IOS开发教程] IOS中用NSJSONSerialization来实现对JSON格式的解析
  8. DRPC实时请求应答服务
  9. Zookeeper watch机制原理
  10. HTML小游戏21 —— html5版暴打皮卡丘游戏(附完整源码)