Queue 配合Thread使用

news/2025/9/22 14:30:15/文章来源:https://www.cnblogs.com/dengz/p/19105221

Queue 配合Thread使用

生产消费者模型

结果

线程【3】开始下载https://picsum.photos/200/300线程【0】开始下载https://picsum.photos/300/300线程【4】开始下载https://picsum.photos/400/300
线程【1】开始下载https://picsum.photos/500/300线程【2】开始下载https://picsum.photos/600/300
>线程【0】 >>状态码为200
线程【0】下载https://picsum.photos/300/300成功
>线程【3】 >>状态码为200
线程【3】下载https://picsum.photos/200/300成功
>线程【1】 >>状态码为200
线程【1】下载https://picsum.photos/500/300成功
>线程【2】 >>状态码为200
线程【2】下载https://picsum.photos/600/300成功
>线程【4】 >>状态码为200
线程【4】下载https://picsum.photos/400/300成功
线程【0】队列已空,没有任务了,退出
线程【3】队列已空,没有任务了,退出
线程【1】队列已空,没有任务了,退出
线程【2】队列已空,没有任务了,退出
线程【4】队列已空,没有任务

示例代码

# -*- coding: utf-8 -*-
# 生产者 producer / 消费者 worker 模型
import queue
import threading
import timeimport requests# producer 【生产者】生产出的数据
image_urls = ["https://picsum.photos/200/300","https://picsum.photos/300/300","https://picsum.photos/400/300","https://picsum.photos/500/300","https://picsum.photos/600/300",
]q = queue.Queue()  # 创建一个队列def worker(thread_id):while True:try:url = q.get(timeout=3)  # 从队列中取出一个url,3秒没有取到就会抛出异常except queue.Empty:print(f"线程【{thread_id}】队列已空,没有任务了,退出")breakprint(f"线程【{thread_id}】开始下载{url}")try:r = requests.get(url, timeout=3)r.raise_for_status()print(f"线程【{thread_id}】 >>状态码为{r.status_code}")filename = f"images/img_{thread_id}_{int(time.time() * 1000)}.jpg"with open(filename, "wb") as f:f.write(r.content)print(f"线程【{thread_id}】下载{url}成功")except  Exception as e:print(f"线程【{thread_id}】下载{url}失败:{e}")q.task_done()  # 告诉队列,这个任务已经完成def run():threads = []for i in range(5):t = threading.Thread(target=worker, args=(i,))t.start()threads.append(t)# 主线程作为生产者,把任务塞进度队列中for url in image_urls:q.put(url)# 等待所有任务处理完成q.join()# 等待线程退出for tt in threads:tt.join()print("下载图片任务完成!")if __name__ == '__main__':run()

知识点

queue.Queue(maxsize=0) 是线程安全的队列

  • 多线程操作同一个队列,不会崩溃,底层用锁保护了
  • put() 是阻塞,队列满了会等
  • get() 是阻塞,队列空了会等
  • task_done() 和join() 搭配使用,表示任务已经处理完了。

timeout =3 ?

  • 防止线程卡在 队列的get() 处。 任务都处理完了还在等
  • 增加超时限制,让线程自动退出

多线程+Queue的场景

  • 图片/视频/文件批量下载
  • 爬虫调度URL抓去
  • 异步日志写入工具
  • 后台任务(上传,转码,消息消费)
  • 实时采集数据和处理

queue.Queue 是多线程世界中的任务通道

参考

https://zhuanlan.zhihu.com/p/1923309703196288836

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEMS 进阶应用:从单厂能耗管理到集团跨区域能源数据协同分析

对于许多现代化集团企业而言,能源成本是运营管理中不可忽视的核心支出。当业务遍布全国乃至全球时,能源管理便从单一的“点”(单个工厂、楼宇)上升为复杂的“面”(整个集团网络)的挑战。传统的单点能耗管理系统已…

Playwright自动化测试框架与AI智能体应用

自动化 数据驱动 MCP协议 智能体,四位一体打造下一代测试体验 本次Playwright自动化测试框架与AI智能体应用的课程将带您深入了解如何利用Playwright这一现代Web自动化测试框架,结合AI智能体技术,提升测试效率与…

快速搞定Dify+Chrome MCP:打造能操作网页的AI助手

你是否想过让AI不仅能回答问题,还能直接操作浏览器帮你做事?比如自动填写网页表单、抓取特定数据、或者点击按钮?现在,通过Dify和Chrome MCP的结合,你可以在3分钟内搭建一个能真正"动手"操作网页的AI助…

以下内容在if判定的时候会被判定为 假

Javascript中被判定为 假 值的情况false 0 和 -0 "" 空字符串 null undefined NaN望粥汁!

Python __init__.py文件

作用在python中,存在__init__.py的文件夹被认为是包。 __init__.py文件一般用来加载包内代码依赖资源和设定包的导出行为。执行时机第一次通过"import xxx"或"from xxx import yyy"的方式, 导入包…

20250330_信安一把梭_考试篇

流量分析, 应急响应, http, ssh, icmp, ftp, telnet, 信安一把梭Tags:流量分析, 应急响应, http, ssh, icmp, ftp, telnet, 信安一把梭 0x00. 题目 某集团的路由器设备被黑客攻击了,运维工程师小辉辉正在打王者走不开…

VS Code配置Conda环境完整指南

1. 配置Anaconda PowerShell Prompt 找到Miniconda路径 [安装路径]\miniconda3\Scripts\activate.bat # 例如: D:\miniconda3\Scripts\activate.bat # 或: C:\Users\[用户名]\miniconda3\Scripts\activate.bat配置VS C…

不同Windows系统中支持的最新.Net Framework/.NET版本

在前面我写过一篇关于不同系统版本中,支持.Net Framework版本情况的文章。 https://www.cnblogs.com/zhaotianff/p/16963712.html 最近在技术群里讨论时,有涉及到Windows XP最高支持到哪个.Net Framework版本的问题。…

avalonia android TextBox多行模式下回车会关闭输入法问题

参考:https://github.com/AvaloniaUI/Avalonia/issues/19220 设置一下就行了。TextInputOptions.SetMultiline(textBox, true); TextInputOptions.SetReturnKeyType(textBox, TextInputReturnKeyType.Return);

每周读书与学习-初识JMeter 元件(二)

每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。 1、前置处理器 在Jmeter…

深入解析:【Spring 全家桶】Spring MVC 快速入门,开始web 更好上手(下篇) , 万字解析, 建议收藏 ! ! !

深入解析:【Spring 全家桶】Spring MVC 快速入门,开始web 更好上手(下篇) , 万字解析, 建议收藏 ! ! !2025-09-22 14:10 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wr…

client-go限速之QPS、Burst 和 RateLimiter

QPS、Burst这两个是rest.Config里的配置,由ctrl.GetConfigOrDie()获得 QPS、Burst的默认值为: k8s.io/client-go@v0.25.0/rest/config.go1 const ( 2 DefaultQPS float32 = 5.0 3 DefaultBurst int = …

三度蝉联Gartner SASE领导者:唯一厂商的技术实力解析

帕洛阿尔托网络凭借Prisma SASE平台第三次获评Gartner SASE魔力象限领导者,该平台集成AI驱动的安全与网络能力,提供零信任访问、多云高可用架构及5倍应用性能提升,为企业提供全球规模的安全连接解决方案。2025年Gar…

水水水 || CSP-S 2025 初赛

95.5pts.初赛随便玩玩。 已严肃完成今日「You have no egg!!!」大学习。Day -1 甚至没有 Day -1.Day 0 只打 S,所以上午没事,摆摆摆。 J 填程最后一题黑题弱化版这么恐怖吗,还是个交互题。 下午出发,结果车上上来一…

python实现网站登录会话脚本 - wanghongwei

# -*- coding: utf-8 -*- import os import requests from bs4 import BeautifulSoupdef login(username, password):"""Args:username: 用户名password: 密码Returns:session: 登录后的会话对象"…

HCM 性能优化函数

HR_INITIALIZE_BUFFER 功能:为特定员工(通过参数 pernr 指定)初始化人事数据缓冲区。作用机制: 加载该员工的主数据(如组织分配、工资信息等)到内存缓冲区中,后续访问同一员工数据时直接从内存读取,避免重复查…

Nginx配置里alias和root的区别

我们用一种非常容易理解的方式来解释 alias 和 root 的区别。 核心比喻:问路 想象一下你在问路:root 就像告诉你一个「大本营」的地址alias 就像给你一个「精确的目的地」地址1. root 指令:告诉你大本营在哪里 工作…

国产DevOps生态崛起:Gitee如何赋能企业数字化转型

国产DevOps生态崛起:Gitee如何赋能企业数字化转型 在数字化转型浪潮席卷全球的当下,中国企业的IT架构正在经历前所未有的变革。根据《中国DevOps现状调查报告》最新数据显示,2022年国内企业DevOps实践率实现了显著增…

【OpenCV】10 图像滤波

作用 将一幅图像通过滤波器转换为另一幅图像。 滤波器又称为卷积核,滤波过程称为卷积。 卷积核 卷积核一般为奇数,如 3x3 5x5 7x7 为什么取奇数?增加padding 保证锚点在中间,防止图像偏移大小的影响? 在深度学习中…

基于java+springboot的社区居民诊疗健康管理系统(源代码+文档+讲解视频) - 指南

基于java+springboot的社区居民诊疗健康管理系统(源代码+文档+讲解视频) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…