单/多线程--协程--异步爬虫
免责声明:本文仅做技术交流与学习...
目录
了解进程和线程
单个线程(主线程)在执行
多线程
线程池
协程(爬虫多用)
假异步:(同步)
真异步:
爬虫代码模版
异步-爬虫
同步效果--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 及以后的…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
