python 多线程+队列的简单应用

在实际处理需求的过程中,博主比较偏爱使用多线程threading + 队列queue的方式 去开发代码。

(本文注重的是搭建模板框架,仅供参考)

举例:

以豆瓣电影的排行为例,写个简单的demo。
豆瓣链接:https://movie.douban.com/top250?start=0&filter=

在这里插入图片描述
一共也就10页!

直接上代码:

import json
import urllib3
import threading
from queue import Queue
from loguru import logger

urllib3.disable_warnings()


class CrawlDoubanMovie(object):
    def __init__(self):
        self.max_times = 5
        self.queue_req = Queue()

    # 创建塞入任务
    def create_tasks(self):
        for i in range(1, 11):
            task_info = {"page_num": i}
            self.queue_req.put(json.dumps(task_info, ensure_ascii=False))
        logger.info(f"本次任务数量:{self.queue_req.qsize()}")

    # 请求解析操作
    def get_content_from_web(self, page):
        pass

    # 解析任务
    def parse_task(self, task_info):
        page_num = task_info["page_num"]
        logger.info(f"正在访问豆瓣电影第【{page_num}】页!")

        if "retry_times" not in task_info.keys():
            task_info["retry_times"] = 0

        if task_info["retry_times"] > self.max_times:
            logger.error(f"current task crawl failed, page_num:{page_num}")
            return
        else:
            try:
                self.get_content_from_web(page_num)
            except Exception as exc:
                retry_task = {"page_num": page_num}
                self.queue_req.put(json.dumps(retry_task, ensure_ascii=False))
                logger.error(f"抓取失败, 重新放入队列中! page_num:{page_num}")
            else:
                logger.info(f"抓取成功,返回内容! page_num:{page_num}")
                pass

    def main_run(self):
        while True:
            task_info = self.queue_req.get()
            if task_info is None:
                self.queue_req.task_done()
                break
            else:
                self.parse_task(json.loads(task_info))
                self.queue_req.task_done()


if __name__ == "__main__":
    threading_num = 6
    crawl = CrawlDoubanMovie()
    crawl.create_tasks()
    for i in range(threading_num):
        t = threading.Thread(target=crawl.main_run)
        t.daemon = True
        t.start()
    crawl.queue_req.join()

模块和函数之间非常的清晰明了,

  • create_tasks() 就负责初始化创建任务
  • get_content_from_web()负责请求和解析数据
  • parse_task() 负责解析任务,这里面还包括了错误重试并重新放入队列中。
  • main_run()主函数 启动程序

搭配了多线程提升很多,也用到了队列。

运行效果图:

在这里插入图片描述
不仅使用方式简单实用,而且速度也是相当的快。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于用Python对电商销售数据分析展示项目

项目背景 假设您有一个电商网站的销售数据集,包含用户购买记录、产品信息和销售时间等信息。您希望通过数据分析来找出哪些产品销售最好,以及哪些用户群体对哪些产品更感兴趣。 目录 项目背景 项目流程 数据收集和导入 数据集示例(CSV格式…

IO 作业 24/2/20

一、思维导图 二、习题 #include <myhead.h> int main(int argc, const char *argv[]) {FILE *fpNULL;FILE *fqNULL;pid_t pidfork();if(pid>0){if((fpfopen("./text.txt","r"))NULL){perror("fopen error");return -1;} if((f…

【2024软件测试面试必会技能】Jmeter_性能测试(3):性能测试脚本的制作和调试

Charles Jmeter的性能测试脚本的制作和调试 以PHP论坛为例&#xff1a;http://47.107.178.45/phpwind/ Charles抓包 1、charles设置过滤&#xff1b;可参考&#xff1a;https://www.cnblogs.com/YouJeffrey/p/15334939.html 2、对于抓包操作进行备注 3、去掉资源文件&…

AS-V1000 视频监控平台产品介绍:客户端功能介绍(四)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1告警管理 3.1.1告警联动 &#xff08;1&#xff09;告警联动显示 &#xff08;2&#xff09;告警联动处理 3…

Packet Tracer - 配置 IPv4 和 IPv6 接口

地址分配表 目标 第 1 部分&#xff1a;配置 IPv4 编址并验证连接第 2 部分&#xff1a;配置 IPv6 编址并验证连接背景信息 路由器 R1 和 R2 分别有两个 LAN。 您的任务是在每台设备上配置合适的编址并验证 LAN 之间的连接。 注&#xff1a;用户 EXEC 密码是 cisco。 特权 E…

单片机学习笔记---红外遥控红外遥控电机调速(完结篇)

目录 低电平触发中断和下降沿触发中断的区别 红外遥控 Int0.c Int.h Timer0.c Timer0.h IR.c IR.h main.c 红外遥控电机调速 Timer1.c Timer.h Motor.c Motor.h main.c 上一节讲了红外发送和接收的工作原理&#xff0c;这一节开始代码演示&#xff01; 提前说…

软件安装遇到bug、报错不知道怎么解决?赶紧收藏起来!

前言 本文举例了几个常见的软件工具使用问题&#xff0c;文末会提供一些我自己整理和使用的工具资料 。 "在追逐零 Bug 的路上&#xff0c;我们不断学习、改进&#xff0c;更加坚定自己的技术信念。让我们相信&#xff0c;每一个 Bug 都是我们成长的机会。" 一、VM…

Microsoft Visio 摄像机图标

Microsoft Visio 摄像机图标 1. 更多形状 -> 搜索形状2. 摄像机References 1. 更多形状 -> 搜索形状 2. 摄像机 ​​​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

2024云服务器ECS新老用户优惠价格表,收费更新

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…

h5页面实现图片局部热区跳转

之前没有了解过图片局部热区跳转这种样式&#xff0c;百度搜索实现方法发现两种方法。所谓图片热区跳转就是用户点击图片中的某些区域可以跳转到不同的页面&#xff0c;如下图&#xff0c;点击“舞动人生馆”可以跳转到舞动人生对应的活动页面&#xff0c;点击展望美好馆可以跳…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现&#xff1a;

Android的Compose

Jetpack Compose 是用于构建原生 Android 界面的新工具包&#xff0c;无需修改任何 XML 布局&#xff0c;也不需要使用布局编辑器。相反&#xff0c;只需调用可组合函数来定义所需的元素&#xff0c;Compose 编译器即会完成后面的所有工作。 简而言之&#xff0c;使用Compose&…

【论文精读】ESViT

摘要 基于transformer的SSL方法在ImageNet线性检测任务上取得了最先进的性能&#xff0c;其关键原因在于使用了基于对比学习方法训练单尺度Transformer架构。尽管其简单有效&#xff0c;但现有的基于transformer的SSL&#xff08;自监督学习&#xff09;方法需要大量的计算资源…

Laravel02 路由基本概念和用法 给视图传递请求参数

Laravel02 路由基本概念和用法 1. 路由的基本概念2. 给视图传递请求参数 1. 路由的基本概念 routes文件夹下的web.php是用来定义路由规则的。 自己定义一个路径 2. 给视图传递请求参数 在laravel里使用一个辅助函数request来快速获取请求参数

[ansible] playbook角色

一、roles Roles又称为角色&#xff0c;playbook被称为剧本。Roles角色是自1.2版本之后引入的新特性&#xff0c;用于层次性、结构化的组织剧本 roles能够根据层次型结构自动装载变量文件、任务集、以及触发的动作等&#xff0c;要使用roles只需要在剧本中使用include命令引入…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…

计算机网络看这里就够了!!!

入门概念 参考视频链接&#xff1a; 1.2 因特网概述_哔哩哔哩_bilibili 一些基础概念 因特网发展阶段&#xff1a; 三个大标题&#xff1a; 从单个ARPANET-----逐步建成三级结构的因特网----逐步形成多层次ISP结构(互联网服务提供商&#xff08;Internet Service Provider…

MAC端Terminus 绿色版下载【一键安装,即可使用】

Termius Mac 是一款非常好用而且漂亮的SSH客户端&#xff0c;能快速远程控制服务器 现在呢&#xff0c;很多小伙伴&#xff0c;都开始使用这个软件啦 但是对于mac系统来说&#xff1a; 这个软件不要在苹果app store下载&#xff0c;不能实现传输功能这个软件目前有7天适用期&a…

【Linux权限】 Linux权限管理 | 粘滞位

文章目录 Linux权限管理什么是权限 ❓&#x1f4a6; 文件访问者的分类(人)&#x1f4a6; 文件类型和访问权限(事物属性) &#x1f4a6; 文件访问权限的相关设置方法目录的权限 粘滞位 Linux权限管理 什么是权限 ❓ 权限本质上是决定某件事情&#xff0c;某人能否做。 Linux下…

【Linux】主机搭建 Linux服务器环境 笔记

目录 前言选择系统软件1. 用U盘装系统2. 安装 Centos7.93. 网络套件 应用软件1. ngnix2. 防火墙配置3. nodejs 后记 前言 过年买了个 mini 主机当玩具玩一下&#xff0c;这里记录下。 选择 已有主力机 (windows) 的情况下&#xff0c;使用过如下四种 Linux宿主环境。这里总…