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

爬虫基础(四)线程 和 进程 及相关知识点

目录

一、线程和进程

(1)进程

(2)线程

(3)区别

二、串行、并发、并行

(1)串行

(2)并行

(3)并发

三、爬虫中的线程和进程

(1)GIL锁

(2)爬虫的多线程

(3)Python的多进程


一、线程和进程

(1)进程

所谓进程,就是正在运行的程序,它占用独立的内存区域

用通俗的话来说:

我们打开媒体播放器,就是打开了一个媒体播放器进程,

打开浏览器,就是打开了一个浏览器进程,

打开某软件,就是打开了某软件进程。

三个进程之间,相互独立,互不影响

但是,同样的由于创建和销毁进程需要分配和回收资源,

所以他们的开销较大

(2)线程

所谓线程,就是进程内的执行单元,而多个线程共享进程的内存空间。

比如,在浏览器进程中

我们一个页面播放音乐

一个页面播放视频

一个页面正在写东西

这三个页面就是三个线程,它们共享该进程的地址空间和其他资源

(3)区别

综上,二者有不同的应用场景:

  • 进程:适合需要高度隔离的任务,比如运行不同的应用程序。

  • 线程:适合需要高效共享数据和并发执行的任务,比如多任务处理、并行计算。


所以,如果你明白了这个,就明白了单线程和多线程、单进程和多进程了。

单线程程序指的是一个进程中只有一个执行线程

多线程程序指的是在一个进程中可以同时有多个执行线程,线程共享进程的资源

单进程指的是一个程序只在一个进程中运行

多进程指的是一个程序可以启动多个独立的进程,每个进程都有自己的内存空间和资源

二、串行、并发、并行

(1)串行

任务按照一定的顺序依次执行,每个任务必须等待前一个任务完成后才能开始执行。

串行的概念很简单,不必多说。

即执行完一个任务,再执行一个任务。

(2)并行

多个任务同时运行(需要多核CPU支持)

比如,现在有三个任务a,b,c

并行就是

同时执行a,b,c三个任务

(3)并发

多个任务交替执行(单核CPU即可)

比如,三个任务a,b,c

并发就是

执行a一段时间,再执行b一段时间,再执行c一段时间

然后返回再执行a一段时间,……

这样的行为,可以让单核CPU看起来,也像是同时执行。

三、爬虫中的线程和进程

(1)GIL锁

GIL:互斥锁。作用就是限制多线程同时执行,保证同一时间内只有一个线程在执行。

最初,GIL锁发明是用来:

防止多个线程同时执行 Python 代码而造成数据不一致性的问题。

即,多个线程可能会同时修改共享数据,导致数据不一致

而GIL锁的出现,则可以解决这一问题。

但,这样同时又出现了新的问题:使得 Python 的多线程无法充分利用多核处理器。

即,限制了并行性,使得多个线程的执行还是会被串行化

举个例子:

比如三个任务a,b,c

串行的执行时间=线程A的执行时间+线程B的执行时间+线程C的执行时间。

并发的执行时间=线程A的执行时间+线程B的执行时间+线程C的执行时间+交换线程执行所需时间。

从这上面来看,Python的多线程实现反而不能提高工作效率,还会因交换线程所增加工作时间

(注:这个例子,就叫执行CPU密集型任务时的问题)

(2)爬虫的多线程

根据上文,由于GIL存在,在执行计算密集型任务时,多线程并不能发挥优势

那么它的优势到底在哪呢?

其优势在于IO密集型任务

比如:

在一个程序的进程中,

有些操作需要时间等待(如爬虫时,我们向服务器发起请求,此时遇到等待)

这时,多线程作用就发挥出来了,

它可以在等待的同时,去执行其他操作,从而提高整体效率。

(3)Python的多进程

对于多进程来说,每一个进程都有自己的GIL锁

所以在多核CPU下,多进程能更好的发挥多核优势

当然,这是针对计算密集型任务来说的,而对于IO密集型任务则差别不大

但从整体来看,python中多进程比多线程更有优势

相关文章:

爬虫基础(四)线程 和 进程 及相关知识点

目录 一、线程和进程 (1)进程 (2)线程 (3)区别 二、串行、并发、并行 (1)串行 (2)并行 (3)并发 三、爬虫中的线程和进程 &am…...

【自开发工具介绍】SQLSERVER的ImpDp和ExpDp工具01

1、开发背景 大家都很熟悉,Oracle提供了Impdp和ExpDp工具,功能很强大,可以进行db的导入导出的处理。但是对于Sqlserver数据库只是提供了简单的图形化的导出导入工具,在实际的开发和生产环境不太可能让用户在图形化的界面选择移行…...

队列—学习

1. 手写队列的实现 使用数组实现队列是一种常见的方法。队列的基本操作包括入队(enqueue)和出队(dequeue)。队列的头部和尾部分别用 head 和 tail 指针表示。 代码实现 const int N 10000; // 定义队列容量,确保够…...

SpringBoot的配置(配置文件、加载顺序、配置原理)

文章目录 SpringBoot的配置(配置文件、加载顺序、配置原理)一、引言二、配置文件1、配置文件的类型1.1、配置文件的使用 2、多环境配置 三、加载顺序四、配置原理五、使用示例1、配置文件2、配置类3、控制器 六、总结 SpringBoot的配置(配置文件、加载顺序、配置原理) 一、引言…...

如何本地部署DeepSeek?DeepThink R1 本地部署全攻略:零基础小白指南。

🚀 离线运行 AI,免费使用 OpenAI 级别推理模型 本教程将手把手教你如何在本地部署 DeepThink R1 AI 模型,让你无需联网就能运行强大的 AI 推理任务。无论你是AI 新手还是资深开发者,都可以轻松上手! 📌 目录…...

陆游的《诗人苦学说》:从藻绘到“功夫在诗外”(中英双语)mastery lies beyond poetry

陆游的《诗人苦学说》:从藻绘到“功夫在诗外” 今天看万维钢的《万万没想到》一书,看到陆游的功夫在诗外的句子,特意去查找这首诗的原文。故而有此文。 我国学人还往往过分强调“功夫在诗外”这句陆游的名言,认为提升综合素质是一…...

Golang —协程池(panjf2000/ants/v2)

Golang —协程池(panjf2000/ants/v2) 1 ants1.1 基本信息1.2 ants 是如何运行的(流程图) 1 ants 1.1 基本信息 代码地址:github.com/panjf2000/ants/v2 介绍:ants是一个高性能的 goroutine 池&#xff0c…...

在 crag 中用 LangGraph 进行评分知识精炼-下

在上一次给大家展示了基本的 Rag 检索过程,着重描述了增强检索中的知识精炼和补充检索,这些都是 crag 的一部分,这篇内容结合 langgraph 给大家展示通过检索增强生成(Retrieval-Augmented Generation, RAG)的工作流&am…...

基于springboot+vue的哈利波特书影音互动科普网站

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

Cypher入门

文章目录 Cypher入门创建数据查询数据matchoptional matchwhere分页with 更新数据删除数据实例:好友推荐 Cypher入门 Cypher是Neo4j的查询语言。 创建数据 在Neo4j中使用create命令创建节点、关系、属性数据。 create (n {name:$value}) return n //创建节点&am…...

使用Z-score进行数据特征标准化

数据标准化是数据处理过程中非常重要的一步,尤其在构建机器学习模型时尤为关键。标准化的目的是将不同量纲的变量转换到相同的尺度,以避免由于量纲差异导致的模型偏差。Z-score标准化是一种常见且简单的标准化方法,它通过计算数据点与平均值的差异,并将其按标准差进行缩放,…...

初级数据结构:栈和队列

一、栈 (一)、栈的定义 栈是一种遵循后进先出(LIFO,Last In First Out)原则的数据结构。栈的主要操作包括入栈(Push)和出栈(Pop)。入栈操作是将元素添加到栈顶,这一过程中&#xf…...

【思维导图】java

学习计划:将目前已经学的知识点串成一个思维导图。在往后的学习过程中,不断往思维导图里补充,形成自己整个知识体系。对于思维导图里的每个技术知识,自己用简洁的话概括出来, 训练自己的表达能力。 面向对象三大特性 …...

Redis脑裂问题详解及解决方案

Redis是一种高性能的内存数据库,广泛应用于缓存、消息队列等场景。然而,在分布式Redis集群中,脑裂问题(Split-Brain)是一个需要特别关注的复杂问题。本文将详细介绍Redis脑裂问题的成因、影响及解决方案。 一、什么是…...

玩转大语言模型——配置图数据库Neo4j(含apoc插件)并导入GraphRAG生成的知识图谱

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

【Windows Server实战】生产环境云和NPS快速搭建

前置条件 本文假定你已达成以下前提条件: 有域控DC。有证书服务器(AD CS)。已使用Microsoft Intune或者GPO为客户机申请证书。服务器上至少有两张网卡(如果用虚拟机做的测试环境,可以用一张HostOnly网卡做测试&#…...

[ESP32:Vscode+PlatformIO]新建工程 常用配置与设置

2025-1-29 一、新建工程 选择一个要创建工程文件夹的地方,在空白处鼠标右键选择通过Code打开 打开Vscode,点击platformIO图标,选择PIO Home下的open,最后点击new project 按照下图进行设置 第一个是工程文件夹的名称 第二个是…...

【NLP251】Transformer精讲 残差链接与层归一化

精讲部分,主要是对Transformer的深度理解方便日后从底层逻辑进行创新,对于仅应用需求的小伙伴可以跳过这一部分,不影响正常学习。 1. 残差模块 何凯明在2015年提出的残差网络(ResNet),Transformer在2016年…...

康德哲学与自组织思想的渊源:从《判断力批判》到系统论的桥梁

康德哲学与自组织思想的渊源:从《判断力批判》到系统论的桥梁 第一节:康德哲学中的自然目的论与自组织思想 核心内容: 康德哲学中的自然目的论和反思判断力概念,为现代系统论中的自组织思想提供了哲学基础,预见了复…...

SpringBoot 整合 SpringMVC:SpringMVC的注解管理

分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <servlet><servlet-name>chapter2&l…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...