python并发爬虫
爬虫多线程方法生成
from threading import Threaddef func(name):for i in range(100):print(f"{name}完成了{i}项任务")if __name__ == '__main__':t1 = Thread(target=func, args=('老杨',))t2 = Thread(target=func, args=('老李',))t3 = Thread(target=func, args=('老孙',))t1.start()t2.start()t3.start()t1.join()t2.join()t3.join()print("主线程结束")
爬虫多线程类生成
from threading import Thread
from time import sleepclass MyThread(Thread):def __init__(self, name):super(MyThread, self).__init__() # 继承MyThread的父类self.name = namedef run(self):for i in range(100):print(f"{self.name}完成了{i}项工作")sleep(0.5)if __name__ == '__main__':t1 = MyThread('老杨')t2 = MyThread('老孙')t3 = MyThread('老李')t1.start()t2.start()t3.start()t1.join()t2.join()t3.join()print("主线程结束")
线程池
from concurrent.futures import ThreadPoolExecutordef func(name):for i in range(10):print(name, i)if __name__ == '__main__':with ThreadPoolExecutor(10) as t: # 作用是创建10个线程for i in range(100):t.submit(func, f"周杰伦{i}")
这段代码使用了 ThreadPoolExecutor
来创建一个线程池,允许并行执行多个任务。具体来说:
-
创建线程池:
ThreadPoolExecutor(10)
创建一个能够同时管理 10 个线程的线程池。 -
提交任务:
t.submit(func, f"周杰伦{i}")
在循环中提交了 100 个任务(i
从 0 到 99)。每个任务调用func
函数,并传入一个字符串参数,格式为"周杰伦{i}"
(例如 "周杰伦0", "周杰伦1", ..., "周杰伦99")。 -
并发执行:
ThreadPoolExecutor
将会在可用的 10 个线程中并发执行这些任务。然而,由于总共有 100 个任务,线程池会轮流使用线程,确保每次都只有 10 个任务在运行。
但是这种会发生资源的争端,后续可以使用生产者消费者的模式,来确保资源不会被重复。
如果想要拿到返回值怎么弄
线程池返回值1
import time
from concurrent.futures import ThreadPoolExecutordef func(name, t):time.sleep(t)return namedef fn(res):print(res.result())if __name__ == '__main__':with ThreadPoolExecutor(10) as t:t.submit(func, '周结论', 3).add_done_callback(fn)t.submit(func, '周一', 2).add_done_callback(fn)t.submit(func, '周二', 1).add_done_callback(fn)
在这段代码中,t.submit(func, '周二', 1)
的结果是一个 Future
对象,它表示异步执行 func
函数的计算结果。add_done_callback(fn)
方法用于注册一个回调函数 fn
,这个回调函数会在 Future
对象完成时被调用。
当 fn
被调用时,它会接收一个参数,该参数是已完成的 Future
对象。这个对象包含了 func
执行的结果、异常信息等。
因此,add_done_callback(fn)
会向 fn
传入这个 Future 对象作为参数。你可以在 fn
函数内通过这个对象访问你需要的信息,比如:
- 如果
func
执行成功,可以通过future.result()
获取结果。 - 如果
func
执行失败,可以通过future.exception()
获取抛出的异常。
在这个业务逻辑当中,add_done_callback返回会立即执行,返回call_back执行的顺序是不确定的,返回的顺序是不确定的。
线程池返回值2
import time
from concurrent.futures import ThreadPoolExecutordef func(name, t):time.sleep(t)print(f"我是", name)return nameif __name__ == '__main__':with ThreadPoolExecutor(10) as t:result = t.map(func, ['周杰伦', '老李', '小王'], [2, 1, 3])for i in result:print(i)
map的返回值是生成器,返回的内容和任务分发的顺序是一致的
我们要学会看函数
这是map的函数,要学会自己看,fn就是要传入的函数,*iterables的意思是可迭代对象,所以列表是可迭代对象吧,元组也是可迭代对象,所以这里不只是传入列表。然后看Returns an iterator equivalent to map(fn ,iter)会返回一个可迭代的对象,所以要拿到返回值我们就可以使用for循环来拿取返回值。
线程池实战案例
网址为北京新发地菜市场:新发地-价格行情
import json
import requests
from concurrent.futures import ThreadPoolExecutor
import threadingheaders = {"Accept": "*/*","Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6","Connection": "keep-alive","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","Origin": "http://www.xinfadi.com.cn","Referer": "http://www.xinfadi.com.cn/priceDetail.html","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0","X-Requested-With": "XMLHttpRequest"
}
url = "http://www.xinfadi.com.cn/getPriceData.html"# 线程锁用于文件写入
file_lock = threading.Lock()def get_data(current):data = {"limit": "20","current": "","pubDateStartTime": "2023/01/01","pubDateEndTime": "2023/12/31", # 设置结束时间"prodPcatid": "","prodCatid": "","prodName": ""}data["current"] = str(current)err_number = 0while True:try:proxy = get_ip()#这里插入自己的代理ipresponse = requests.post(url, headers=headers, data=data, proxies=proxy)response.raise_for_status() # 检查请求是否成功data_list = json.loads(response.text)['list']except requests.exceptions.RequestException as e:err_number += 1if err_number == 10:print(f"{current}请求次数超过10次")print(f'{current}号请求失败: {e}')returnexcept json.JSONDecodeError as e:err_number += 1if err_number == 10:print(f"{current}请求次数超过10次")print(f'{current}号JSON解析失败: {e}')returnexcept KeyError as e:err_number += 1if err_number == 10:print(f"{current}请求次数超过10次")print(f'{current}号数据格式错误: {e}')returncontinuefor item in data_list:prodName = item.get("prodName", "")highPrice = item.get("highPrice", "")lowPrice = item.get("lowPrice", "")avgPrice = item.get("avgPrice", "")# 使用线程锁确保文件写入安全with file_lock:with open('data.csv', mode='a', encoding='utf-8') as f:f.write(f'{current}, {prodName}, {lowPrice}, {avgPrice}, {highPrice}\n')print(f"{current}号的数据爬取完成")if __name__ == '__main__':# 初始化或清理 data.csv 文件with open('data.csv', mode='w', encoding='utf-8') as f:f.write("日期, 产品名称, 最低价, 平均价, 最高价\n")with ThreadPoolExecutor(max_workers=10) as t: # 调整线程池大小for day in range(1, 40):t.submit(get_data, day)
讲解一下,这里的ThreadPoolExecutor(max_workers=10) as t:
下面有for循环,每次爬取的数据包不一样,所以在爬取数据包上不会造成数据冲突,但是在写入数据的时候,有可能会造成数据重复,所以这里采用了数据锁,在写文件的时候,保证每次只有一个线程对文件进行写操作。
多进程多线程
多进程和多线程差不多,读者可以去看我在python收录下的并发程序这篇文章
相关文章:
python并发爬虫
爬虫多线程方法生成 from threading import Threaddef func(name):for i in range(100):print(f"{name}完成了{i}项任务")if __name__ __main__:t1 Thread(targetfunc, args(老杨,))t2 Thread(targetfunc, args(老李,))t3 Thread(targetfunc, args(老孙,))t1.st…...
react-create-app整合windicss
引用:https://blog.csdn.net/gitblog_00339/article/details/142544145 package.json: "react": "^19.0.0","react-dom": "^19.0.0","react-scripts": "5.0.1","typescript": "^4.9.5…...
fircrawl本地部署
企业内部的网站作为知识库给dify使用,使用fircrawl来爬虫并且转换为markdown。 git clone https://github.com/mendableai/firecrawl.gitcd ./firecrawl/apps/api/ cp .env.example .env cd ~/firecrawl docker compose up -d 官方: https://githu…...
Linux 设备分类详解:字符设备、块设备与网络设备解析
引言 在嵌入式 Linux 领域,设备驱动程序是操作系统与硬件之间的桥梁。Linux 设备按照不同的访问方式和特性可以划分为字符设备、块设备和网络设备。理解它们的分类及特性,对于开发 Linux 设备驱动和操作底层硬件至关重要。本文将深入解析这三大类设备的…...
抽象的算法0.1.3.2版本
前言: 公式:(基础 基础 基础 ...更多的基础) 维度(影响因素) 问题 将问题分解成一个个基础和变量,便可轻松解决问题 ————不知名的作者 因为实在是写不出来了,所以直…...
JSON简介及C++中的JSON使用指南
1. 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用文本格式存储和传输数据。它易于人阅读和编写,同时也易于机器解析和生成。JSON广泛应用于Web API、配置文件、数据存储等领域。 JS…...
责任链模式-java
1、spring依赖注入模式 @Configuration public class ChainConfig {@Beanpublic ChainSpringFactory chainSpringFactory(List<IHandler<DemoOne,Boolean>> handlerList){return new ChainSpringFactory(handlerList);}} public class DemoOne { }public abstract…...
精华贴分享|从不同的交易理论来理解头肩形态,殊途同归
本文来源于量化小论坛策略分享会板块精华帖,作者为孙小迪,发布于2025年2月17日。 以下为精华帖正文: 01 前言 学习了一段时间交易后,我发现在几百年的历史中,不同门派的交易理论对同一种市场特征的称呼不一样&#x…...
Oracle归档配置及检查
配置归档位置到 USE_DB_RECOVERY_FILE_DEST,并设置存储大小 startup mount; !mkdir /db/archivelog ALTER SYSTEM SET db_recovery_file_dest_size100G SCOPEBOTH; ALTER SYSTEM SET db_recovery_file_dest/db/archivelog SCOPEBOTH; ALTER SYSTEM SET log_archive…...
Apache HttpClient使用
一、Apache HttpClient 基础版 HttpClients 是 Apache HttpClient 库中的一个工具类,用于创建和管理 HTTP 客户端实例。Apache HttpClient 是一个强大的 Java HTTP 客户端库,用于发送 HTTP 请求并处理 HTTP 响应。HttpClients 提供了多种方法来创建和配…...
STM32C011 进入停止模式和待机模式
对于STM32C011J4M3微控制器,你可以使用HAL库来实现进入停止模式(Stop Mode)和待机模式(Standby Mode)。下面是进入停止模式和待机模式的示例代码: 进入停止模式代码示例: #include "stm3…...
2. 初识go-zero
介绍 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。 go-zero 中的 api,rpc,数据库等涉及的代码,都可以给我们一键生成,无需耗费我们什么精力…...
【身份安全】零信任安全框架梳理(一)
目录 零信任网络安全防护理念一、定义零信任原则 二、零信任实现方式三、零信任的核心机制和思想1. 持续验证(Continuous Verification)2. 多因素认证(MFA)与强身份验证3. 细粒度权限控制(最小权限原则)4. …...
Ansys Zemax | 联合Speos实现供应商与OEM交换黑盒光学系统
附件下载 联系工作人员获取附件 本文展示了供应商和OEM如何交换加密光学模型(也称为黑匣子模型),从Ansys Zemax OpticStudio中的光学元件设计到Ansys Speos中的系统分析。 概述 在供应商和OEM之间,有两种类型的黑盒模型可以从…...
简历含金量的描述和注意事项!
背景 最近,在公司负责后端相关面试,简历看了不下 50 份,面试 10,纯手码 2000 多字,说说我对简历的看法,希望给大家一点启发。 教育经历 在众多求职面试中,我发现多数求职者容易忽视教育背景的…...
GPT Researcher 的win docker安装攻略
github网址是:https://github.com/assafelovic/gpt-researcher 因为docker安装方法不够清晰,因此写一个使用方法 以下是针对 Windows 系统 使用 Docker 运行 AI-Researcher 项目的 详细分步指南: 步骤 1:安装 Docker 下载 Docke…...
语言模型理论基础-持续更新-思路清晰
1.预训练 相似的任务A、B,任务A已经用大数据完成了训练,得到模型A。 我们利用-特征提取模型的-“浅层参数通用”的特性,使用模型A的浅层参数,其他参数再通过任务B去训练(微调)。 2.统计语言模型 通过条件…...
【C++指针】搭建起程序与内存深度交互的桥梁(下)
🔥🔥 个人主页 点击🔥🔥 每文一诗 💪🏼 往者不可谏,来者犹可追——《论语微子篇》 译文:过去的事情已经无法挽回,未来的岁月还可以迎头赶上。 目录 C内存模型 new与…...
ElasticSearch常用优化点
关闭交换分区:因为Linux采用了三级页表虚存管理,关闭交换分区可以减少系统IO,页面换入唤出时所耗费的总线时间以及减少系统中断次数;swap的使用会显著增加延迟和降低吞吐量。文件描述符配置:任何网络应用都需要增加文件…...
数据结构每日一题day3(顺序表)★★★★★
题目描述:顺序表L的元素递增有序排列,设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想:在递增有序的顺序表中插入元素 x 并保持有序性,步骤如下: 合法…...
VS Code 中 .history`文件的来源与 .gitignore`的正确使用
引言 在使用 VS Code 进行 Git 版本控制时,有时会发现项目中多出一个 .history 目录,并被 Git 识别为未跟踪文件。本文将解释 .history 的来源,并提供 .gitignore 的正确配置方法,确保开发环境的整洁性。 1. .history 文件的来源…...
2025-03-26 学习记录--C/C++-PTA 6-3 求链式表的表长
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 6-3 求链式表的表长 本题要求实现一个函数,求链式表的表长。 函数接口定义: &…...
element-plus中Cascader级联选择器组件的使用
目录 一.基本使用 二.进阶使用 1.如何获取最后一级选项的值? 2.如何让级联选择器的输入框只展示最后一级? 三.实战 1.场景描述 2.实现步骤 ①设计后端返回值Vo ②编写controller ③编写service ④编写mapper层 ⑤在前端,通过发送…...
性能测试、负载测试、压力测试的全面解析
在软件测试领域,性能测试、负载测试和压力测试是评估系统稳定性和可靠性的关键手段。它们各自关注不同的测试目标和应用场景,理解这些差异对于制定有效的测试策略至关重要。 本文对性能测试、负载测试和压力测试进行深入分析,探讨其定义、…...
阶段一:Java基础语法
目标:掌握Java的基本语法,理解变量、数据类型、运算符、控制结构等。 1. Java开发环境搭建 安装JDK配置环境变量编写第一个Java程序 代码示例: // HelloWorld.java public class HelloWorld { // 定义类名为 HelloWorldpublic static vo…...
信息安全的数学本质与工程实践
信息安全的本质是数学理论与工程实践的高度统一。在这个数字空间与物理世界深度融合的时代,信息安全已从简单的数据保护演变为维系数字社会正常运转的基础设施。对于计算机专业学习者而言,理解信息安全需要超越工具化认知,深入其数学内核与系…...
GPU架构与通信互联技术介绍
文章目录 GPU架构介绍SM 和 Warp Scheduler GPU通信互联技术介绍1、GPUDirectGPUDirect Shared AccessGPUDirect P2PGPUDirect for VideoGPUDirect for RDMARDMAGPUDirect RDMA GPUDirect Storage 2、NVLink & NVSwitchNVLinkNVSwitch 3、应用场景总结 GPU架构介绍 SM 和 …...
解决Centos使用yum命令报错“Cannot find a valid baseurl for repo: base/7/x86_64”问题
一、问题描述 我们在使用Centos7.9使用【sudo yum install influxdb2】命令安装influxDB数据库的时候提示“Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/release=7&arch=x86_64&repo=os&infra=stock …...
CosyVoice2在Windows系统上本地部署的详细步骤
CosyVoice2在Windows系统上本地部署的详细步骤: 下载源码并初始化: 确保你的设备上安装了Git。打开命令提示符(cmd),执行以下命令来克隆仓库:git clone --recursive https://github.com/FunAudioLLM/CosyVo…...
【拒绝算法PUA】LeetCode 2255. 统计是给定字符串前缀的字符串数目
目录 系列文章目录 专题总结: C刷题技巧总结: 题目 2116. 判断一个括号字符串是否有效 难度 描述 解题方法1 系列文章目录 专题总结: 【拒绝算法PUA】0x00-位运算【拒绝算法PUA】0x01- 区间比较技巧【拒绝算法PUA】0x02- 区间合并技…...
华为HCIE鸿蒙应用开发认证靠谱吗?
在万物互联时代,智能终端设备的多样性与协同需求催生了操作系统的革新。华为HarmonyOS(鸿蒙系统)凭借其分布式架构与全场景能力,正成为打破设备边界、重塑用户体验的核心技术底座。HCIE鸿蒙应用开发认证作为华为认证体系的顶级资质…...
AWE 2025:当AI科技遇见智能家居
3月20日,以“AI科技、AI生活”为主题的AWE2025(中国家电及消费电子博览会)在上海新国际博览中心开幕。作为全球家电行业风向标,本届展会最大的亮点莫过于健康理念在家电领域的全面渗透。从食材保鲜到空气净化,从衣物清…...
CSS选择器
文章目录 基本选择器复合选择器交集选择器并集选择器后代选择器子代选择器兄弟选择器相邻兄弟选择器通用兄弟选择器 属性选择器伪类选择器动态伪类结构伪类:first-child:last-child:nth-child:nth-last-child:first-of-type:last-of-type:nth-of-type:nth-last-of-type:only-ch…...
吐血整理:Air8201如何使用LuatOS进行电源管理功能!
在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…...
C++11QT复习 (四)
Day6-1 输入输出流运算符重载(2025.03.25) 1. 拷贝构造函数的调用时机 2. 友元2.1 友元函数 3. 输入输出流运算符重载3.1 关键知识点3.2 代码3.3 关键问题3.4 完整代码 4. 下标访问运算符 operator[]4.1 关键知识点4.2 代码 5. 函数调用运算符 operator…...
Allure 报告数据存储结构
Allure 报告数据存储结构 Allure的报告的下有一个data目录,里面存储了全部展示的数据。data目录下面有两种类型的文件一类是csv,一类是json,两个类型的文件中同名的文件数据是一样的,只是不同的展示方法。我们就按照json格式的数据…...
HarmonyOS:基于axios实现文件的下载以及下载进度的监听
#前言:项目开发中,避免不了实现文件下载功能,其他平台的下载都很成熟,网上的例子也比较多,我就自己项目中实现的下载功能做个总结,你可以参考我的写法实现功能。 下载封装基于axios实现的下载功能。 1.下载…...
应用服务接口第二次请求一直pending问题
目录 一、问题背景二、问题排查过程三、解决方案四、总结 一、问题背景 升级内容发布到灰度环境,验证相关服务,查看接口调用日志,发现第一次请求正常,第二次相同接口请求就一直pending,其他服务也是如此 二、问题排查…...
外设的中断控制
如ADC、SPI、I2C、TIM等使用STM32 HAL库时的中断函数调用方式和UART非常类似,都有底层直接使能中断和上层库函数管理两种方式。下面详细说明几种典型外设: 一、ADC外设 (1)直接使能中断(底层控制)…...
云资源开发学习应用场景指南,场景 1 云上编程实践平台
云资源开发学习应用场景指南 云资源开发学习应用场景指南,场景 2:云桌面实验室 云资源开发学习应用场景指南,场景 3:云资源支持的项目实践 场景 1:云上编程实践平台 《如何在云平台上搭建你的第一个编程实践环境》…...
C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因
文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案:手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集(0条记录)复制到Excel时崩溃的原因及解决方法如下: 原因分析 空记录集…...
第四届能源、电力与电气国际学术会议(ICEPET 2025)
重要信息 地点:中国-成都 官网:www.icepet.net(了解参会投稿等信息) 时间:2025年4月25-27日 简介 第四届能源、电力与电气会(ICEPET 2025定于2025年4月25-27日在中国成都举办。 本次将围绕能源、电力及…...
【IDEA的个性化配置】
目录: 一:隐藏项目路径二:禁用斜体注释三:重新Maven构建未完待续... 一:隐藏项目路径 😊在IDEA左侧的Project目录中,项目名称后面显示了项目的文件路径地址,如果不喜欢可以隐藏&…...
分享最近前端面试遇到的一些问题
前情提要(分享个人情况,可以直接跳过) 先说一下我的个人情况,我是2026届的,目前是在找前端实习。 3月初,从3月3日开始在Boss上投简历。 分享我的个人故事,不想看可以直接滑到下面,…...
SSH免密登录服务器方法
Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙,使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …...
3.26前端模拟面试
包含 Vue 3、TypeScript、性能优化、工程化等方面,偏八股文。 基础知识 Vue 3 响应式原理:Vue 3 如何实现响应式系统?Proxy 和 Reflect 的作用是什么? TypeScript 类型体操:实现一个 TypeScript 类型 DeepPartial&am…...
23种设计模式-备忘录(Memento)设计模式
备忘录设计模式 🚩什么是备忘录设计模式?🚩备忘录设计模式的特点🚩备忘录设计模式的结构🚩备忘录设计模式的优缺点🚩备忘录设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
六十天Linux从0到项目搭建(第八天)(缓冲区、gitee提交)
一 缓冲区,C中有很多字符a. 可显字符 b.控制字符 在 C 语言 中,字符可以分为 可显字符(Printable Characters) 和 控制字符(Control Characters),它们通常存储在 缓冲区(Buffer&…...
QOpenGLWidget视频画面上绘制矩形框
一、QPainter绘制 在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOg…...
vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token
vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token http.tsapp.tsvue文件 http.ts import axios from axios // 引入axios import router from /router import Qs from qs import { ElMessage } from element-plusconst { prefixBasePath } requir…...