单/多线程--协程--异步爬虫
免责声明:本文仅做技术交流与学习...
目录
了解进程和线程
单个线程(主线程)在执行
多线程
线程池
协程(爬虫多用)
假异步:(同步)
真异步:
爬虫代码模版
异步-爬虫
同步效果--19+秒
异步效果--7+秒
了解进程和线程
# --------------------> # ------> # -------> # --------> # 1-线程 #线程:执行一个软件后的操作---点赞,签到,评论等等 #进程:执行一个软件
一家公司里面人去做事. 1人,2人,多人... (要合理分配,合理运用.) --30万的资本,养不起10000人呀. 1个进程必须要有一个线程,--- 线程不是越多越好. 单线程/多线程 进程:资源单元 线程:执行单元
# 每一个py程序默认都有一个线程的,
print("111")
单个线程(主线程)在执行

多线程
from threading import Thread
# alt + enter 快捷键导包
def func(name):for i in range(1, 1000):print("func函数在执行---" + str(i),name)
# func() # 这样写就是主线程执行.
# 创建线程对象,分配线程的任务是func (公司招人要分配任务)
t = Thread(target=func,args=('my name xiaodi',)) # args的参数必须是一个元组.
# 启动线程: (员工先忙完手头工作,然后真正工作)
t.start() # 线程的状态,可以开始工作的状态了,具体的执行时间由CPU决定.
t1 = Thread(target=func,args=('xiaosedi',))
t1.start()
# 主线程不会受到子线程(其他线程)的干扰. 主线程该干什么就干什么.
for i in range(1, 1000):print("主---" + str(i))
# 多个线程都输出到控制台上,就会乱.
# 传参在创建线程对象时也要传.
# 线程数由电脑的CPU决定,如果处理不好,反而会效率下降.
线程池
# 线程池 :一次性开辟一些线程,直接给线程池提交任务,具体的任务到底哪个线程执行,是由线程池分配的
from concurrent.futures.thread import ThreadPoolExecutor
def func(name):for i in range(1000):print(name, 'func函数执行', i)
# 创建一个有50个线程的线程池.(合理的利用资源~)
# -----执行10次func函数,每个func函数执行1000次.
with ThreadPoolExecutor(50) as t:# t = ThreadPoolExecutor(50)for i in range(10):# 给线程去提交任务t.submit(func, name=f'线程{i}')
# 等待线程池中的任务全部执行完毕,才会继续执行
print('print执行了')
协程(爬虫多用)
import asyncio
import time
def func():print("函数开始")time.sleep(3) # 当到此时,当前线程为阻塞状态,CPU不会为当前程序提供工作.print("函数结束")
func()
# 阻塞代码:(必须要等待某个结果等等
# input(等待输入) time.sleep(强制等待) requests(请求网络,client<->server有时间差,
# 程序基于 i(input) o(output) 操作时,线程机会处于阻塞状态,CPU就不会提供工作.
# ---阻塞的时候就会干等着,---怎么让CPU在干等着的时候也做点事情呢?--->协程!!!
# 协程:当程序遇见了io操作的时候,可以选择性的切换到其它任务上。
# 多任务异步操作:
假异步:(同步)
import asyncio
import time
async def func1():print('func1函数开始')time.sleep(3) # 属于同步操作代码。# 只要在异步程序中出现了同步操作,异步就被中断# await asyncio.sleep(3)print('func1函数结束')
async def func2():print('func2函数开始')time.sleep(2)# await asyncio.sleep(2)print('func2函数结束')
async def func3():print('func3函数开始')time.sleep(4)# await asyncio.sleep(4)print('func3函数结束')
# 拿到函数的对象
f1 = func1()
f2 = func2()
f3 = func3()
tasks = [# 创建一个任务f1, f2, f3
]
start = time.time()
# 如果是多个任务,需要一个asyncio.wait(任务列表)搭配
asyncio.run(asyncio.wait(tasks))
print(time.time() - start)
9+秒结束!!! ---没有异步呀---
因为time是一个同步模块,
time.sleep() # 属于同步操作代码。 # 只要在异步程序中出现了同步操作,异步就被中断
真异步:
import asyncio
import time
async def func1():print('func1函数开始')# time.sleep(3) # 属于同步操作代码await asyncio.sleep(3) # 异步休眠代码 --不是强制性的休眠,而是挂起,让他先去忙别的东西,等好了再回来.print('func1函数结束')
async def func2():print('func2函数开始')# time.sleep(2)await asyncio.sleep(2)print('func2函数结束')
async def func3():print('func3函数开始')# time.sleep(4)await asyncio.sleep(4)print('func3函数结束')#async def main():
# f1 = func1()
# f2 = func2()
# f3 = func3()
# tasks = [
# f1,f2,f3
# # 创建一个任务
# # asyncio.create_task(func1()),
# # asyncio.create_task(func2()),
# # asyncio.create_task(func3())
# ]
# await asyncio.wait(tasks)
# start = time.time()
# asyncio.run(main())
# print(time.time() - start)
f1 = func1()
f2 = func2()
f3 = func3()
tasks = [f1, f2, f3# 创建一个任务
]
start = time.time()
# 如果是多个任务,需要一个asyncio.wait(任务列表)搭配
asyncio.run(asyncio.wait(tasks))
print(time.time() - start)

4+秒 , 好快呀...
爬虫代码模版
import asyncio
async def download(url):print('准备开始下载')# await asyncio.sleep(2) # 网络请求# requests.get(url) # 异步效果中断,那怎么结合呢???print('下载完成')
async def main():urls = ['地址1','地址2','地址3',]# tasks = []# for url in urls:# tasks.append(download(url))
# 列表推导式写法 循环url列表,每循环一次,创建一个任务tasks = [download(url) for url in urls]await asyncio.wait(tasks)
asyncio.run(main())
requests.get(url) # 异步效果中断,那怎么结合呢???
只要出现同步操作,异步就会被终断.
-------->
异步-爬虫
因为requests模块是同步的,如果在异步协程中编写同步代码,异步效果没有。 如何解决? 更换支持异步的请求模块 aiohttp == requests pip install aiohttp pip install aiofiles
同步效果--19+秒

import time
import requests
urls = ['https://www.cgwallpapers.com/wallpapers_free_wreoiux/wallpaper_christian_dimitrov_02_1920x1080.jpg','https://www.cgwallpapers.com/wallpapers_free_wreoiux/wallpaper_pablo_carpio_17_1920x1080.jpg','https://www.cgwallpapers.com/wallpapers_free_wreoiux/wallpaper_dejian_wu_04_1920x1080.jpg'
]
t = time.time()
for url in urls:res = requests.get(url).content# 文件名name = url.split('/')[-1]with open(name, 'wb') as f:f.write(res)
print(f'requests花费时间===》{time.time() - t}')
# requests花费时间===》19.635247230529785
异步效果--7+秒

import asyncio
import time
import aiofiles
import aiohttp
urls = ['https://www.cgwallpapers.com/wallpapers_free_wreoiux/wallpaper_christian_dimitrov_02_1920x1080.jpg','https://www.cgwallpapers.com/wallpapers_free_wreoiux/wallpaper_pablo_carpio_17_1920x1080.jpg','https://www.cgwallpapers.com/wallpapers_free_wreoiux/wallpaper_dejian_wu_04_1920x1080.jpg'
]
async def download(url):print('准备开始下载--->')# s = aiohttp.ClientSession() == requests #拿到对象# s.get() s.post === requests.get() requests.post()# --------------------------------------# aiohttp requests# res.text() res.text# res.read() res.content# res.json() res.json()# --------------------------------------async with aiohttp.ClientSession() as s:async with s.get(url) as res:# 写入文件name = url.split('/')[-1]# 文件正常操作:# with open(name,'wb')as f:# f.write(await res.read())# 文件异步操作:async with aiofiles.open(name, 'wb') as f:await f.write(await res.read())print('下载完成')
async def main(urls):tasks = [download(url) for url in urls]await asyncio.wait(tasks)
t = time.time()
asyncio.run(main(urls))
print(f'aiohttp花费时间===》{time.time() - t}')
# aiohttp花费时间===》7.244250774383545
相关文章:
单/多线程--协程--异步爬虫
免责声明:本文仅做技术交流与学习... 目录 了解进程和线程 单个线程(主线程)在执行 多线程 线程池 协程(爬虫多用) 假异步:(同步) 真异步: 爬虫代码模版 异步-爬虫 同步效果--19秒 异步效果--7秒 了解进程和线程 # --------------------> # ------> # …...
android pdf框架-11,查看图片
前10篇文章,9章关于pdf的,pdf解析后,里面也是有各种图片,于是利用pdf的view来展示图片,似乎也是个不错的想法. android手机中的图片查看功能,有的可以展示,有的不能.比如华为,荣耀对大体积的png是可以显示的,小米是不显示,只有缩略图. 一张png50m大,比如清明上河图,原图是tif…...
【CSS】深入浅出弹性布局
CSS的弹性布局(Flexbox)是一种用于在容器中沿着一维方向(水平或垂直)来布局、对齐和分配容器内项目空间的有效方式。它旨在提供一个更加有效的方式来布局、对齐和分配容器中项目的空间,即使它们的大小未知或是动态变化…...
医院挂号系统小程序的设计
管理员账户功能包括:系统首页,个人中心,患者管理,医生管理,专家信息管理,科室管理,预约信息管理,系统管理 微信端账号功能包括:系统首页,专家信息࿰…...
广州外贸建站模板
Yamal外贸独立站wordpress主题 绿色的亚马尔Yamal外贸独立站wordpress模板,适用于外贸公司建独立站的wordpress主题。 https://www.jianzhanpress.com/?p7066 赛斯科Sesko-W外贸建站WP主题 适合机械设备生产厂家出海做外贸官网的wordpress主题,红橙色…...
KDP数据分析实战:从0到1完成数据实时采集处理到可视化
智领云自主研发的开源轻量级Kubernetes数据平台,即Kubernetes Data Platform (简称KDP),能够为用户提供在Kubernetes上的一站式云原生数据集成与开发平台。在最新的v1.1.0版本中,用户可借助 KDP 平台上开箱即用的 Airflow、AirByte、Flink、K…...
【人工智能】-- 智能机器人
个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉机器人介绍 🍈机器人硬件 🍍机械结构 🍍传感器 🍍控…...
Android广播机制
简介 某个网络的IP范围是192.168.0.XXX,子网 掩码是255.255.255.0,那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一 网络上的所有端口,这样在该网络中的每台主机都将会收到这条广播。为了便于进行系统级别的消息通知&…...
SQL FOREIGN KEY
SQL FOREIGN KEY 简介 SQL(Structured Query Language)是用于管理关系数据库管理系统(RDBMS)的标准编程语言。在SQL中,FOREIGN KEY是一个重要的概念,用于建立和维护数据库中不同表之间的关系。本文将详细介绍SQL FOREIGN KEY的概念、用途、以及如何在SQL中实现和使用FO…...
绘唐3最新版本哪里下载
绘唐3最新版本哪里下载 绘唐最新版本下载地址 推文视频创作设计是一种通过视频和文字的形式来进行推广的方式,可以通过一些专业的工具来进行制作。 以下是一些常用的小说推文视频创作设计工具: 视频剪辑软件:如Adobe Premiere Pro、Fina…...
[ES6] 箭头函数
JavaScript 是一种广泛使用的编程语言,随着其发展和演变,引入了很多新的特性来提高代码的可读性和开发效率。其中一个重要的特性就是 ES6(ECMAScript 2015)中引入的箭头函数(Arrow Function)。箭头函数不仅…...
BiLSTM模型实现
# 本段代码构建类BiLSTM, 完成初始化和网络结构的搭建 # 总共3层: 词嵌入层, 双向LSTM层, 全连接线性层 # 本段代码构建类BiLSTM, 完成初始化和网络结构的搭建 # 总共3层: 词嵌入层, 双向LSTM层, 全连接线性层 import torch import torch.nn as nn# 本函数实现将中文文本映射为…...
linux内核源码学习所需基础
1.面向对象的思想,尤其是oopc的实现方式。 2.设计模式。 这两点需要内核源码学习者不仅要会c和汇编,还要接触一门面向对象的语言,比如c++/java/python等等任意一门都行,起码要了解面向对象的思想。 另外li…...
Java并发编程-AQS详解及案例实战(上篇)
文章目录 AQS概述AQS 的核心概念AQS 的工作原理AQS 的灵活性使用场景使用指南使用示例AQS的本质:为啥叫做异步队列同步器AQS的核心机制“异步队列”的含义“同步器”的含义总结加锁失败的时候如何借助AQS异步入队阻塞等待AQS的锁队列加锁失败时的处理流程异步入队的机制总结Ree…...
第11章 规划过程组(二)(11.8排列活动顺序)
第11章 规划过程组(二)11.8排列活动顺序,在第三版教材第391页; 文字图片音频方式 第一个知识点:主要输出 1、项目进度网络图 如图11-20 项目进度网络图示例 带有多个紧前活动的活动代表路径汇聚,而带有…...
DP学习——观察者模式
学而时习之,温故而知新。 敌人出招(使用场景) 多个对象依赖一个对象的状态改变,当业务中有这样的关系时你出什么招? 你出招 这个时候就要用观察者模式这招了! 2个角色 分为啥主题和观察者角色。 我觉…...
如何利用GPT-4o生成有趣的梗图
文章目录 如何利用GPT-4o生成有趣的梗图一、引言二、使用GPT-4o生成梗图1. 提供主题2. 调用工具3. 获取图片实际案例输入输出 三、更多功能1. 创意和灵感2. 梗图知识 四、总结 如何利用GPT-4o生成有趣的梗图 梗图,作为互联网文化的一部分,已经成为了我们…...
深入理解 KVO
在 iOS 中,KVO(Key-Value Observing)是一个强大的观察机制,它的底层实现相对复杂。KVO 利用 Objective-C 的动态特性,为对象的属性提供观察能力。 KVO 的底层实现 1. 动态子类化 当一个对象的属性被添加观察者时&am…...
当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
文章目录 一、选择合适的排序算法1. 快速排序2. 归并排序3. 堆排序 二、数据结构优化1. 使用索引2. 压缩数据3. 分块排序 三、外部排序1. 多路归并排序 四、利用多核和并行计算1. 多线程排序2. 使用并行流 五、性能调优技巧1. 避免不必要的内存复制2. 缓存友好性3. 基准测试和性…...
kubernetes集群部署:node节点部署和cri-docker运行时安装(四)
安装前准备 同《kubernetes集群部署:环境准备及master节点部署(二)》 安装cri-docker 在 Kubernetes 1.20 版本之前,Docker 是 Kubernetes 默认的容器运行时。然而,Kubernetes 社区决定在 Kubernetes 1.20 及以后的…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
