当前位置: 首页 > news >正文

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程,可以减少爬虫的运行时间,提高效率。不过需要注意的是,在爬取过程中需要合理的管理线程数,以避免对被爬取的网站造成过大的负荷。

一、线程基础

1、继承Thread方式的线程

当需要再此启动一个线程时,需要再创建对象,不能重复使用。

2、推荐的创建线程方式:继承Runnalbe,使用Thread类

1.5之前就这两种
callable 第三种
可以有返回值 call()
可以抛出异常
支持泛型返回值
需要借助FutureTask, 如获取返回值的时候

class MyThread implements Callable{public Object call() throws Exception{....return null;}
}MyThread thread = new MyThread();
FutureTask f = new FutureTask(thread);
new Thread(f).start();
new Thread(f).start(); // 反复执行不会执行,需要定义新的task
try{Object ret = f.get();// get()为返回值,会阻塞主线程执行
}catch(InterruptedException){}catch(Execution e){}

在这里插入图片描述

线程池 第四种方式

提高速度,降低资源消耗
便于线程管理:核心池大小,最大线程数,没任务多长时间终止

//Executors 工具类
//ExecutorService 接口
ExecutorService service = Executors.newFixedThreadPool(10);
ThreadPoolExecutor executor = (ThreadPoolExecutor)service;
executor.setxxx() //设置参数
service.execute(Runnable);
service.submit(Callable);
service.shutdown();

b

在这里插入图片描述

4、线程分类

守护线程,用户线程

守护线程服务用户线程

thread.setDaemon(true) //设置为守护线程

最简单程序main主线程与gc回收线程

若没有用户线程jvm则结束

5、线程生命周期

NEW : 创建对象
RUNNABLE :运行 start
BLOCKED:阻塞 sleep,join,等待同步锁,wait,suspend:过时方法
WAITING:wait()
TIMED-WAITING:wait(time)
TERMINATED:stop,exception,run结束
阻塞—》就绪:sleep,join结束获取同步锁,notify,resume:过时方法

6、注意

wait:阻塞,会释放锁,必须在synchronized内
sleep:阻塞,不会释放锁,任何时候可以
wait,notify,notifyall,必须在同步方法快内,方法内,不能使用lock,他们调用时是锁对象.wait,要注意 此时syn(锁对象),两个所对象必须相同

二、线程同步

sync

与wait搭配,notify搭配,若与Lock搭配会造成异常

多用while,不用if

同步代码块,synchronized 自动锁

要求所有相乘同一把锁 synchronized(obj) obj是同一个对象,或同一个类

同步方法:当方法内容全部需要同步时

非静态方法锁即时this 需要注意

静态方法时,锁时当前类本身

Lock :接口 1.5之后

condition

能够手动开启同步,结束同步,手动锁,指定睡眠,指定唤醒

实现类

ReentrantLock:功能与synchronized,可重入锁

ReentrantReadWriteLock.ReadLock,有读锁的线程可以共享该方法,几乎相当于没加锁

ReentrantReadWriteLock.WriteLock,其他线程不共享该方法

ReentrantLock lock = new ReentrantLock();
final Condition flag1=lock.newCondition();
final Condition flag2=lock.newCondition();
try{lock.lock();flag1.await();...
}finally{lock.unlock();
}
flag2.singal();

三、线程通信

定制化通信:

/* 例:
* 切菜
* 炒菜
* 上菜
* 同时10道菜
*/
// 这里就不能用sync,需要定制化通信(唤醒睡眠的线程)
// 顺序:线程 操作 资源类
CookingLockcondation flag1,flag2,flag3cut()cooking()gaving()
Cookingnew thread(()->{for(int i=0;i<5;i++)cooking.cut();}).start()new thread(()->{for(int i=0;i<5;i++)cooking.cooking();}).start()new thread(()->{for(int i=0;i<5;i++)cooking.giving();}).start()

lambda表达式
接口可写静态方法实现,
普通方法实现,加default 关键字即可

四、JUC工具类

数据库中读写一般不是同步的

JUC中读写都是同步的,即读写同步,因为JVM线程必须加锁,否则不安全,比数据库严格

ReentraReadWriteLock:读写锁,写程序优先

CountDownLatch:计数器

CountDown count = new CountDown(10);
count.await();  // 到此方法时会判断count里面的数值,为0时继续主线程,适用于秒杀业务

CyclicBarrier:循环栅栏,多个线程处于同一状态时,才继续CyclicBarrier任务。

CyclicBarrier = cyc = new CyclicBarrier(7,任务)for (int i=0;i<7;i++)new Thread(){()->{xxxxxcyc.await();    }}

Semaphere:信号灯

Sempahere s= new Semaphere(3);for (int i=0;i<7;i++)new Thread(){()->{s.acquire();// 资源不够时会阻塞xxxxs.release();// 表示释放了资源}}

相关文章:

爬虫为什么需要多线程

多线程爬虫是一种同时运行多个线程来提高爬取速度的爬虫方式。通过将大量的工作分配给不同的线程&#xff0c;可以减少爬虫的运行时间&#xff0c;提高效率。不过需要注意的是&#xff0c;在爬取过程中需要合理的管理线程数&#xff0c;以避免对被爬取的网站造成过大的负荷。 …...

下一代智能座舱风口下,“超级”Tier 1强势崛起

智能座舱进入全新周期&#xff0c;强者愈强的趋势会快速显现。 可以观察到&#xff0c;智能座舱功能日趋多元化。从多屏互动到舱内全场景多元交互&#xff0c;到更多娱乐平台的上线&#xff0c;智能座舱已经从最初的重多功能转变成重体验。 从架构层面来看&#xff0c;各个功…...

第 三 章 UML 类图

文章目录 前言一、依赖关系&#xff08;虚线箭头&#xff09;二、泛化关系&#xff1a;继承&#xff08;实线空心箭头&#xff09;三、实现关系&#xff08;虚线空心箭头&#xff09;四、关联关系&#xff08;一对一为实线箭头&#xff0c;一对多为实线&#xff09;五、聚合关系…...

java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…...

内网穿透实现在外远程连接RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自远控源码文章&#xff1a;无公网IP&#xff…...

抖音数字人主播app

抖音数字人主播app是指一款利用计算机生成的虚拟数字人&#xff0c;在抖音平台上进行实时音视频传输和互动的应用程序。该软件可以让用户创建自己的虚拟数字人&#xff0c;并在抖音平台上进行实时互动和交流。 抖音数字人主播app通常需要包含以下功能&#xff1a; 3D建…...

亚马逊平台使用API接口通过关键字搜索商品

亚马逊公司&#xff08;Amazon&#xff0c;简称亚马逊&#xff1b;NASDAQ&#xff1a;AMZN&#xff09;&#xff0c;2022年营收为5140亿美元&#xff0c; 是美国最大的一家网络电子商务公司&#xff0c;位于华盛顿州的西雅图。是网络上最早开始经营电子商务的公司之一&#xff…...

《花雕学AI》用ChatGPT创造猫娘角色:人工智能角色扮演聊天对话的风险与对策

出于好奇心&#xff0c;我以“ChatGPT&#xff0c;调教猫娘”为题&#xff0c;开始了解ChatGPT角色扮演提示语的用法。ChatGPT给出的介绍是&#xff0c;调教猫娘是一种利用ChatGPT的角色扮演功能&#xff0c;让模型模仿一种类似猫的拟人化生物的行为和语言的活动&#xff0c;并…...

软件测试常规测试过程模型——V模型与X模型

一、V模型简单介绍及讲解 V模型是软件测试过程模型中最广为人知的模型&#xff0c;尽管很多富有实际经验的测试人员还是不太熟悉V模型&#xff0c;或者其它的模型。V模型中的过程从左到右&#xff0c;描述了基本的开发过程和测试行为。V模型的价值在于它非常明确地标明了测试过…...

feign-starter

使用说明 功能 自动装配 设置客户端不主动重试日志打印客户端负载均衡json 转换使用 JacksonUtil 如何引入 com.hete.support xx-feign-starter 如何配置 超时时间 ⚠️ 默认值比较大&#xff0c;需要手动根据实际场景设置 feign: client: config: # 默认配置&#xff0c;…...

FVM初启,Filecoin生态爆发着力点在哪?

Filecoin 小高潮 2023年初&#xff0c;Filecoin发文分享了今年的三项重大变更&#xff0c;分别是FVM、数据计算和检索市场的更新&#xff0c;这些更新消息在发布后迅速吸引了市场的广泛关注。 特别是在3月14日&#xff0c;Filecoin正式推出了FVM&#xff0c;这一变革使得Filec…...

对比度亮度调整与通道分离合并

对比度亮度调整与通道分离合并 对比度亮度调整: 1)原理介绍: g’ g * Mult Add ⚫ g 表示原图像像素 ⚫ g’ 表示输出图像像素 ⚫ Mult 被称为增益(gain), 通常用来控制图像的对比度 ⚫ Add 通常被称为偏置(bias), 通常用来控制图像的亮度 g’(i,j) Mult * g(i,j) Add …...

Java终止线程

1、正常运行结束 程序运行结束&#xff0c;线程自动结束。 2、使用stop方法强制终止 不安全&#xff0c;不建议使用&#xff1a; 调用 stop() 方法会立刻停止 run() 方法中剩余的全部任务&#xff0c;包括在 catch 或 finally 语句中的&#xff0c;并抛出ThreadDeath异常&a…...

Qt的Qss用法

Qt 的 Qss 是一种用于定义用户界面的样式表语言。它可以用来定义控件的颜色、字体、边框、背景等样式&#xff0c;可以很方便的实现自定义的样式效果。 Qss 的基本语法和 CSS 类似&#xff0c;主要是由选择器和样式属性构成。 选择器 选择器用来指定要样式化的控件&#xff…...

数塔dp -A

文章目录 数塔dp -A程序设计程序分析数塔dp -A 【问题描述】 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点, 则经过的结点的数字之和最小是多少? 已经告诉你了,这是个DP的题目,你…...

Spring MVC 接收 json 和返回 json (14)

目录 总入口 测试case 源码分析 1. 针对RequestBody的参数解析 2. 针对 ResponseBody 的返回值处理 总入口 通过上一篇Spring MVC 参数解析&#xff08;13&#xff09;_chen_yao_kerr的博客-CSDN博客的说明&#xff0c;相信大家对Sping MVC的参数解析有了一定的了解&…...

注释和关键字

注释 注释概念 ●注释是在程序指定位置添加的说明性信息 ●简单理解&#xff1a;对代码的一种解释说明&#xff0c;方便我们程序员更好的去阅读代码 例如&#xff1a; public class HelloWorld {//这是通过class定义了一个类&#xff0c;类名叫HelloWorld public static voi…...

第一次参加CSDN周赛,这体验很难说···

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSDN周赛】 本篇文章目录 &#x1f30f;前言&#x1f30f;一、勾股数&#x1f338;题目描述&#x1f338;题解 &a…...

8.DRF组件之认证、权限

DRF(Django Rest Framework)提供了一套权限和身份认证系统,可以在视图中进行配置。权限系统用于控制用户对资源的访问权限,身份认证系统用于验证用户的身份信息。 DRF支持以下几种权限控制方式: AllowAny:不做任何验证,允许所有用户访问。 IsAuthenticated:只允许已经…...

初识Tkinter弹窗

Tkinter弹窗 Tkinter是什么 Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口”)是Python的标准Tk GUI工具包的接口。作为 python 特定的GUI界面&#xff0c;是一个图像的窗口&#xff0c;tkinter是python 自带的&#xff0c;可以编辑的GUI界面&#xff…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...