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

目录

一、线程和进程

(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中多进程比多线程更有优势

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】B2120 单词的长度

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯我的做法代码实现:思路解析: 💯老师的第一种做法代码实现:思路解析: 💯老师的…

nvm的安装和使用

打开地址下载 https://github.com/coreybutler/nvm-windows/releases 推荐下载,nvm-setup.zip 这个。可能有的教程会让下载nvm-noinstall.zip 。noinstall确实下载之后不用安装,但是要自己配置setting.txt文件,以及环境变量 。 安装nvm 在电…

嵌入式知识点总结 操作系统 专题提升(四)-上下文

针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项? 5.请问线程需要保存哪些…

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

web-SQL注入-CTFHub

前言 在众多的CTF平台当中,作者认为CTFHub对于初学者来说,是入门平台的不二之选。CTFHub通过自己独特的技能树模块,可以帮助初学者来快速入门。具体请看官方介绍:CTFHub。 作者更新了CTFHub系列,希望小伙伴们多多支持…

力扣动态规划-19【算法学习day.113】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.矩形中移动的最大次数 题目链接…

js笔记(黑马程序员)

js(day2) 一、运算符 1.赋值运算符 运算符作用加法赋值-减法赋值*乘法复制/除法赋值%取余赋值 2.一元运算符 符号作用说明自增变量自身的值加1,如X--自减变量自身的值减1,如X-- 3.比较运算符 运算符作用>左边是否大于右…

使用Pygame制作“青蛙过河”游戏

本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典,玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型,包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…

联想拯救者Y9000P IRX8 2023 (82WK) 原厂Win11 家庭中文版系统 带一键还原功能 安装教程

安装完重建winre一键还原功能,和电脑出厂时的系统状态一模一样。自动机型专用软件,全部驱动,主题壁纸,自动激活,oem信息等。将电脑系统完全恢复到出厂时状态。 支持机型 (MTM) : 82WK 系统版本:Windows 1…

2025年02月02日Github流行趋势

项目名称:oumi 项目地址url:https://github.com/oumi-ai/oumi 项目语言:Python 历史star数:1416 今日star数:205 项目维护者:xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介:构建最…

【Elasticsearch】硬件资源优化

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

AJAX笔记原理篇

黑马程序员视频地址: AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…

Unity Shader Graph 2D - 跳动的火焰

在游戏中,火焰是一种常见的特效。通常来讲火焰特效通过粒子系统的方式实现的相对较多,本文将通过Shader Graph的方式来实现一种不同的火焰效果。 那么怎么实现呢 首先创建一个名为Fire的Shader Graph文件,然后创建一个名为M_Fire的材质球。 …

【二分题目】

二分 分巧克力求阶乘计算方程 分巧克力 分巧克力 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您的代码...int nscan.nextInt…

集合通讯概览

集合通信概览 (1)通信的算法 是根据通讯的链路组成的 (2)因为通信链路 跟硬件强相关,所以每个CCL的库都不一样 芯片与芯片、不同U之间是怎么通信的 多卡训练:多维并行(xxx并行在上一期已经讲述…

GWO优化SVM回归预测matlab

灰狼优化算法(Grey Wolf Optimizer,简称 GWO),是由澳大利亚格里菲斯大学的 Mirjalii 等人于 2014 年提出的群智能优化算法。该算法的设计灵感源自灰狼群体的捕食行为,核心思想是对灰狼社会的结构与行为模式进行模仿。 …

LLM - 基于LM Studio本地部署DeepSeek-R1的蒸馏量化模型

文章目录 前言开发环境快速开始LM Studio简单设置模型下载开始对话 模型选择常见错误最后 前言 目前,受限于设备性能,在本地部署的基本都是DeepSeek-R1的蒸馏量化模型,这些蒸馏量化模型的表现可能并没有你想象的那么好。绝大部分人并不需要本…

csapp笔记3.6节——控制(1)

本节解决了x86-64如何实现条件语句、循环语句和分支语句的问题 条件码 除了整数寄存器外,cpu还维护着一组单个位的条件码寄存器,用来描述最近的算数和逻辑运算的某些属性。可检测这些寄存器来执行条件分支指令。 CF(Carry Flag&#xff09…

电路研究9.2.8——合宙Air780EP中IP 应用相关命令使用方法研究

这个有点吐血了,之前研究的时候只想着网络了,所以我对AT指令的那几个基本等指令以外,是跳到后面看的网络,加上IP也算网络里面的,就没注意,当时使用搜索查找时候并没有搜到ATSAPBR指令,结果这里打…

ubuntu解决普通用户无法进入root

项目场景: 在RK3566上移植Ubuntu20.04之后普通用户无法进入管理员模式 问题描述 在普通用户使用sudo su试图进入管理员模式的时候报错 解决方案: 1.使用 cat /etc/passwd 查看所有用户.最后一行是 若无用户,则使用 sudo useradd -r -m -s…