爬虫为什么需要多线程

news2025/3/10 5:41:45

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

一、线程基础

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,需要定制化通信(唤醒睡眠的线程)
// 顺序:线程 操作 资源类
Cooking
    Lock
    condation flag1,flag2,flag3
    cut()
    cooking()
    gaving()
Cooking
    new 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(){
        ()->{
            xxxxx
            cyc.await();    
        }
    }

Semaphere:信号灯

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

再聊 MySQL 聚簇索引

为什么是再次理解呢&#xff1f;因为松哥之前写过相关的文章介绍过聚簇索引&#xff0c;但是感觉还不够&#xff0c;因此今天想再来和小伙伴们聊一聊这个话题。 1. 什么是聚簇索引 数据库的索引从不同的角度可以划分成不同的类型&#xff0c;聚簇索引便是其中一种。 聚簇索引…

家用洗地机怎么选?洗地机选购技巧分享

洗地机是一种专业的清洁设备&#xff0c;广泛应用于商业和工业领域。它可以有效地清洗和护理各种硬表面地板&#xff0c;如混凝土、大理石、瓷砖和木地板等。洗地机不仅能够提高清洁效率&#xff0c;还可以使地面更加卫生、美观和持久。而且大部分洗地机还拥有一键自清洁、除菌…

为什么企业都需要搭建搭建一个内部知识库?

企业内部知识管理是指企业通过各种手段收集、整理、管理和传播企业内部的知识&#xff0c;以提高企业的竞争力和创新能力。在实践中&#xff0c;企业内部知识管理往往需要建立一个内部知识库&#xff0c;以更好地实现知识的共享和管理。本文将从以下几个方面探讨为什么企业内部…

华为豪气分红720亿,持股员工人均超50万?

当有的公司还在因为各种原因裁员的时候&#xff0c;有的公司已经要分红了。 最近&#xff0c;华为在内部论坛“心声社区”公布&#xff0c;经华为公司内部有权机构决议&#xff0c;拟向股东分配股利人民币 719.55 亿元。相比 2021 年分红总额 614.04 亿元&#xff0c;同比增加…

centos8与centos7对比

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

计算广告(十三)

Wide & Deep Wide & Deep模型是一种结合了广度学习&#xff08;wide learning&#xff09;和深度学习&#xff08;deep learning&#xff09;方法的混合模型。它旨在解决推荐系统中的记忆&#xff08;memorization&#xff09;和泛化&#xff08;generalization&#…

使用Java操作文件与文件IO流(字节流,缓冲字节流,字符流,缓冲字符流)

文章目录 1. 认识文件2. 文件的类型3. 操作文件3.1 属性3.2 构造方法3.3 常用方法 4. IO流4.1 字节流4.1.1 InputStream4.1.2 OutputStream4.1.3 flush刷新4.1.4 关闭文件close4.1.5 字节缓冲流 4.2 字符流4.2.1 Reader4.2.2 Writer4.2.3 Scanner4.2.4 字符缓冲流 5. 复制文件5…

深度学习优化方法

如有错误&#xff0c;感谢不吝赐教、交流 文章目录 一、梯度下降如何选择学习率不能太小不能太大 二、小批量随机梯度下降如何选择批量大小不能太小不能太大 总结 三、常用优化方法SGDAdagradAdam实现大佬经验 一、梯度下降 如何选择学习率 不能太小 以缓慢的速度接近最优值&…

sqoop的介绍与安装

简介 Sqoop 是一款开源的工具&#xff0c;主要用于在 Hadoop(Hive) 与传统的数据库 (mysql 、 postgresql...) 间进行数据的传递&#xff0c;可以将一个关系型数据库&#xff08;例如 &#xff1a; MySQL ,Oracle ,Postgres 等&#xff09;中的 数据导进到 Hadoop 的 …

从单兵作战到生态共创,纵目科技打响智驾2.0新战役

4月18日&#xff0c;第十二届上海国际汽车工业展览会&#xff08;简称&#xff1a;2023上海车展&#xff09;在上海国家会展中心盛大启幕。纵目科技携最新自动驾驶解决方案——Amphiman 3000、8000行泊一体解决方案、Trinity 3000、8000舱行泊一体解决方案以及众多摄像头产品强…

15-721 Chapter8 数据分布model分析

Data Organization 有两个data pool&#xff0c;一个是不可变长的block&#xff0c;一个是可变长的block,然后要定位的话&#xff0c;我们只要知道是哪个block&#xff0c;和他的offset,我们就可以定位 下面是数据类型&#xff0c;单个类型太大的话&#xff0c;我们要来个溢出…

真的很迷茫!

作者&#xff1a;阿秀 校招八股文学习网站&#xff1a;https://interviewguide.cn 这是阿秀的第「258」篇原创 小伙伴们大家好&#xff0c;我是阿秀。 欢迎今年参加秋招的小伙伴加入阿秀的学习圈&#xff0c;目前已经超过 2300 小伙伴加入&#xff01;去年认真准备和走下来的基…

vue 中quill-editor富文本图片和视频上传功能

quill-editor富文本对于新手来说是个很友好的富文本编辑器。但是里面的图片上传和视频上传功能在实际的工作中不能满足要求。 1.原生的图片上传会转换成bas64格式, 2.视频上传只是个输入框,要有视频链接了才能添加视频;而且视频标签是iframe标签,并不是video标签。 现在…

大数据分析案例-基于XGBoost算法构造房屋租赁价格评估模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

asp.net+sqlserver基于web的在校大学生贷款管理系统

采用的技术&#xff1a; 1.ASP.NET框架&#xff1b; 2. SQL Server 数据库&#xff1b; 3.AJAX技术&#xff1a;它不是一种新的编程语言&#xff0c;而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术&#xff1b; 4.HTML,CSSDIV,代码实现静态页面&#xff1b; 开…

HTML5 <output> 标签、HTML5 <optgroup> 标签

HTML5 <output> 标签 实例 HTML5 <output>标签用来定义不同类型的输出。请参考下述示例&#xff1a; 将计算结果显示在 <output> 元素中&#xff1a; <form oninput"x.valueparseInt(a.value)parseInt(b.value)">0<input type"ran…

达索系统基于系统工程的AUTOSAR设计端到端解决方案 | 达索系统百世慧®

目录 达索系统基于系统工程的AUTOSAR设计端到端解决方案 达索系统&#xff1a;陪伴AUTOSAR一起成长 达索系统的解决方案&#xff1a;MBSE和AUTOSAR结合 软件设计端到端的追溯能力 系统架构设计中的“条理分明” 全贯通的一站式平台 科技是第一生产力&#xff0c;达索系统…

项目设计:迷宫游戏设计day2

今天主要把搜出最短路径想出来了&#xff0c;但还是没有优化&#xff0c;其思想就是&#xff0c;再搜的时候&#xff0c;记录它的前驱结点&#xff0c;这样就能在最后的时候就可以把它的最短路径以反序遍历的方式&#xff0c;将他输出出来 明天再优化优化

JVM系统优化实践(17):线上GC案例(二)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; GC的概念并不难明白&#xff0c;而且它的原理也不复杂&#xff0c;但是很难用好。为什么&#xff1f;因为每个平台、架构、指标、运行环境都不一样&#xff0c;甚…

设计模式-行为型模式之中介者模式

2. 中介者模式 2.1. 模式动机 在用户与用户直接聊天的设计方案中&#xff0c;用户对象之间存在很强的 关联性&#xff0c;将导致系统出现如下问题&#xff1a; 系统结构复杂 对象之间存在大量的相互关联和调用&#xff0c;若有一个对象发生变化&#xff0c;则需要跟踪和该对象关…