当前位置: 首页 > news >正文

python queue.Queue介绍

queue.Queue 是 Python 中的线程安全队列,适合用于多线程或多进程环境中进行任务和数据的共享。queue.Queue 提供了 FIFO(先进先出)队列的实现,并包含线程锁机制以保证在多线程环境下数据的安全性。

queue.Queue 的主要方法:

  1. put(item, block=True, timeout=None):向队列中添加一个元素。

    • block:如果队列已满,是否阻塞(默认为 True)。
    • timeout:如果阻塞,等待的最长时间。
  2. get(block=True, timeout=None):从队列中取出一个元素。

    • block:如果队列为空,是否阻塞(默认为 True)。
    • timeout:如果阻塞,等待的最长时间。
  3. qsize():返回队列中当前元素的数量(注意,这个方法在某些平台上并不可靠)。

  4. empty():如果队列为空,返回 True

  5. full():如果队列已满,返回 True

  6. put_nowait(item):等同于 put(item, block=False),即如果队列满了,不阻塞直接抛出异常。

  7. get_nowait():等同于 get(block=False),即如果队列为空,不阻塞直接抛出异常。

代码示例:

import queue
import threading
import time# 定义一些简单的任务函数
def task1():print("Executing task 1")time.sleep(1)return "Result of task 1"def task2():print("Executing task 2")time.sleep(2)return "Result of task 2"def task3():print("Executing task 3")time.sleep(1.5)return "Result of task 3"# 创建一个 Queue 队列
task_queue = queue.Queue()# 生产者:向队列中放入函数
def producer():task_queue.put(task1)task_queue.put(task2)task_queue.put(task3)task_queue.put(None)  # 用 None 作为结束信号# 消费者:从队列中取出函数并执行
def consumer():while True:task = task_queue.get()  # 获取队列中的任务(即函数)if task is None:  # 检查是否为结束信号breakresult = task()  # 执行函数print(result)    # 打印函数返回值task_queue.task_done()  # 标记任务完成# 创建并启动生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)producer_thread.start()
consumer_thread.start()# 等待所有任务完成
producer_thread.join()
task_queue.join()  # 等待队列中的所有任务完成
consumer_thread.join()print("All tasks are done.")

代码解释:

  1. 定义任务函数

    • task1task2task3 是简单的函数,它们各自执行一些操作并返回结果。
  2. 生产者

    • producer 函数将这些任务函数放入 task_queue 中,并在最后放入 None 作为结束信号。
  3. 消费者

    • consumer 函数不断从 task_queue 中取出任务(函数),并执行这些任务。通过 task() 调用函数,然后打印返回值。
    • 当遇到 None 时,消费者退出循环,表示所有任务已经完成。
  4. task_queue.join():确保所有任务都执行完毕,并且队列中没有未处理的任务。

http://www.lryc.cn/news/445963.html

相关文章:

  • Qt 每日面试题 -3
  • TypeScript系列:第四篇 - typeof 与 keyof
  • JDK8新增特性(值得收藏)
  • MATLAB系列06:复数数据、字符数据和附加画图类
  • 【永磁同步电机(PMSM)】 4. 同步旋转坐标系仿真模型
  • CSAPP Attack Lab
  • 通信工程学习:什么是NFVI网络功能虚拟化基础设施层
  • 不在同一局域网怎么远程桌面?非局域网环境下,实现远程桌面访问的5个方法分享!
  • SparkSQL-初识
  • Go语言的垃圾回收(GC)机制的迭代和优化历史
  • thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)
  • 对于电商跨境电商独立站中源代码建站和SaaS建站的区别
  • 使用vite+react+ts+Ant Design开发后台管理项目(二)
  • C++之 string(中)
  • 双向链表的基本结构及功能实现
  • stm32定时触发软件中断
  • blender设置背景图怎么添加?blender云渲染选择
  • MMD模型及动作一键完美导入UE5-Blender方案(三)
  • 网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业
  • 如何在O2OA中使用ElementUI组件进行审批流程工作表单设计
  • 三、LLM应用开发准备工作
  • 机器学习-可解释性机器学习:随机森林与fastshap的可视化模型解析
  • 使用Assimp加载glb/gltf文件,然后使用Qt3D来渲染
  • vue实现左侧数据拖拽到右侧区域,且左侧数据保留且左侧数据不能互相拖拽改变顺序
  • 人工智能与机器学习原理精解【21】
  • 【MySQL 01】数据库基础
  • C语言字符学习中级使用库解决问题
  • 网络管理:网络故障排查指南
  • Springboot常见问题(bean找不到)
  • 架构设计笔记-5-软件工程基础知识