通过几段代码,详解Python单线程、多线程、多进程

【PyQt】05-多线程 文章开始还是解释一下,这是跟着王铭东老师学习的。提示:以下是本篇文章正文内容,下面案例可供参考单线程在Python中,单线程是指在程序中只有一个执行线程,它按照顺序逐行执行代码。这意味着每次只能执行一个任务或操作,直到完成后才能执行下一个任务。单线程模型适用于简单的程序或任务,其中没有太多需要同时处理的操作。在单线程中,代码的执行是以同步的方式进行的,也就是说,每个操作都必须等待前一个操作完成后才能执行。虽然单线程简单易于理解和实现,但也有一些缺点。 阅读详情

在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。

一、进程和线程

进程可以理解为是正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的单位。由于每一次调度进程的开销比较大,为此才引入的线程。一个进程可以拥有多个线程,一个进程中可以同时存在多个线程,这些线程共享该进程的资源,线程的切换消耗是很小的。因此在操作系统中引入进程的目的是更好地使多道程序并发执行,提高资源利用率和系统吞吐量;而引入线程的目的则是减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

下面用简单的例子进行描述,打开本地计算机的”任务管理器”如图1所示,这些正在运行的程序叫作进程。如果将一个进程比喻成一个工作,指定10个人来做这份工作,这10个人就是10个线程。因此,在一定的范围内,多线程效率比单线程效率更高。

图1.任务管理器

二、Python中的多线程与单线程

在我们平时学习的过程中,使用的主要是单线程爬虫。一般来说,如果爬取的资源不是特别大,使用单线程即可。在Python中,默认情况下是单线程的,简单理解为:代码是按顺序依次运行的,比如先运行第一行代码,再运行第二行,依次类推。在前面章节所学习知识中,都是以单线程的形式实践的。

举个例子,批量下载某网站的图片,由于下载图片是一个耗时的操作,如果依然采用单线程的方式下载,那么效率就会特别低,意味着需要消耗更多的时间等待下载。为了节约时间,这时候我们就可以考虑使用多线程的方式来下载图片。

threading模块是Python中专门用来做多线程编程的模块,它对thread进行了封装,使用更加方便。例如需要对写代码和玩游戏两个事件使用多线程进行,案例代码如下。

import threading``import time``# 定义第一个``def coding(): for x in range(3): print('%s正在写代码\n' % x) time.sleep(1)``# 定义第二个``def playing(): for x in range(3): print('%s正在玩游戏\n' % x) time.sleep(1)``# 如果使用多线程执行``def multi_thread(): start = time.time() # Thread创建第一个线程,target参数为函数命 t1 = threading.Thread(target=coding) t1.start() # 启动线程 # 创建第二个线程 t2 = threading.Thread(target=playing) t2.start() # join是确保thread子线程执行完毕后才能执行下一个线程 t1.join() t2.join() end = time.time() running_time = end - start print('总共运行时间 : %.5f 秒' % running_time)``# 执行``if __name__ == '__main__': multi_thread() # 执行单线程

运行结果如图2所示。

图2.多线程运行结果

那么执行单线程会消耗多少时间,案例代码如下所示。

import time``# 定义第一个``def coding(): for x in range(3): print('%s正在写代码\n' % x) time.sleep(1)``# 定义第二个``def playing(): start = time.time() for x in range(3): print('%s正在玩游戏\n' % x) time.sleep(1) end = time.time() running_time = end - start print('总共运行时间 : %.5f 秒' % running_time)``def single_thread(): coding() playing()``# 执行``if __name__ == '__main__': single_thread() # 执行单线程

运行结果如图3所示。

图3.单线程运行结果

经过以上多线程和单线程的运行结果,可以看出多线程中写代码和玩游戏是一起执行的,单线程中则是先写代码再玩游戏。从时间上来说,可能只有细微的差距,当执行工作量很大的时候,便会发现多线程消耗的时间会更少,从这个案例中我们也可以知道,当所需要执行的任务并不多的时候,只需要编写单线程即可。

三、单线程改为多线程

以某直播的图片爬取为例,案例代码如下。

import requests``from lxml import etree``import time``import os`` ``dirpath = '图片/'``if not os.path.exists(dirpath): os.mkdir(dirpath) # 创建文件夹`` ``header = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'``}``def get_photo(): url = 'https://www.huya.com/g/4079/' # 目标网站 response = requests.get(url=url, headers=header) # 发送请求 data = etree.HTML(response.text) # 转化为html格式 return data`` ``def jiexi(): data = get_photo() image_url = data.xpath('//a//img//@data-original') image_name = data.xpath('//a//img[@class="pic"]//@alt') for ur, name in zip(image_url, image_name): url = ur.replace('?imageview/4/0/w/338/h/190/blur/1', '') title = name + '.jpg' response = requests.get(url=url, headers=header) # 在此发送新的请求 with open(dirpath + title, 'wb') as f: f.write(response.content) print("下载成功" + name) time.sleep(2)`` ``if __name__ == '__main__': jiexi()

如果需要修改为多线程爬虫,只需要修改主函数即可,例如创建4个线程进行爬取,案例代码如下所示。

if __name__ == "__main__": threads = [] start = time.time() # 创建四个进程 for i in range(1, 5): thread = threading.Thread(target=jiexi(), args=(i,)) threads.append(thread) thread.start() for thread in threads: thread.join() end = time.time() running_time = end - start print('总共消耗时间 : %.5f 秒' % running_time) print("全部完成!") # 主程序``

学习资源推荐

如果你也喜欢编程,想通过学习Python获取更高薪资,这里给大家分享一份Python学习资料。

😝朋友们如果有需要的话,可以V扫描下方二维码免费领取🆓

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

#### **一、Python学习路线**

image-20230619144606466

python学习路线图1

二、Python基础学习
1. 开发工具

2. 学习笔记

在这里插入图片描述

3. 学习视频

在这里插入图片描述

三、Python小白必备手册

图片

四、数据分析全套资源

在这里插入图片描述

五、Python面试集锦
1. 面试资料

在这里插入图片描述

在这里插入图片描述

2. 简历模板

在这里插入图片描述

** 因篇幅有限,仅展示部分资料,添加上方即可获取**
Python的单线程和多线程 python的单线程和多线程 阅读详情

相关推荐

Ubuntu 20.04 生产级 Slackbot 实战:Event API + systemd 稳定部署

Slackbot 不是简单的 HTTP 推送脚本,而是需兼顾事件响应、资源管控与服务可靠性的系统级应用。其核心依赖 Slack 官方 Event API 实现双向通信与消息确认,结合 Ubuntu 20.04 原生 systemd 进行进程管理、内存限制与优雅重启。技术价值在于规避 Webhook 的单向局限与 RTM 的废弃风险,通过 Socket Mode 实现低延迟、高可靠交互;典型场景包括 SaaS 内部自动化运维(如 /deploy 命令链式响应)、跨团队协作通知及权限受控的频道机器人。本文聚焦生

weixin_34161029的博客 593

Python爬虫:单线程、多线程、多进程

在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5542

3段代码详解python中的单线程、多线程和多进程

在并发编程中,使用适当的并发模型可以提高程序执行效率和性能。Python提供了单线程、多线程和多进程三种方式来实现并发执行任务。单线程是指程序在同一时间只能执行一个任务,多线程是指程序可以同时执行多个任务,而多进程是指程序可以创建多个进程来执行任务。在本文中,我们将详细探讨Python中这三种并发方式的特点和使用方法,以及它们适用的场景。当涉及到并发执行任务时,Python提供了多种方式来实现,其中包括单线程、多线程和多进程。下面是几段代码来详解这三种方式的实现。

这家伙很懒,什么都没有留下 755

看几段爬虫代码,详解Python多线程、多进程、协程

线程就是实现异步的一个方式,也就是说多线程是异步处理异步就意味着不知道处理结果,有时候我们需要了解处理结果,就可以采用。爬虫的加速是重要技能,但适当控制速度也是爬虫工作者的良好习惯,不要给服务器太大压力,拜拜~很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。配合动态协作就可以达到异步非阻塞的目的,本质只用了一个线程,所以很大程度利用了资源。库的代码稍繁琐,但支持更多的拓展。

wadfdhsajd的博客 332

VMFS数据存储(datastore)丢失后恢复步骤

vmfs datastore恢复步骤

jetliu05的博客 3271

AD7920实战:从咪头到ADC的音频信号采集电路设计全解析(附电路图)

本文详细解析了基于AD7920 ADC芯片的音频信号采集电路设计全流程。从驻极体咪头的驱动、AD8542运放的两级增益与偏置设计,到关键的抗混叠滤波器配置,以及ADC接口的驱动缓冲与PCB布局要点,提供了完整的实战指南与电路图,帮助开发者实现高质量音频信号采集。

red88的博客 807

多线程处理list_看几段爬虫代码,详解Python多线程、多进程、协程

一、前言很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用多进程、多线程、协程来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。二、同步首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返回状态码,其中parse_1函数可以设定循环次数,每次循环将当前循环数(从...

weixin_39886619的博客 100

从零开始:如何用STM32和MAX30100打造你的第一台智能心率监测设备

本文详细介绍了如何使用STM32微控制器和MAX30100传感器从零开始构建智能心率监测设备。涵盖硬件选择、电路设计、软件开发到心率算法实现的全过程,特别适合嵌入式开发新手和创客。通过OLED显示和蓝牙串口传输数据,打造低成本、高精度的心率检测仪,为健康监测项目提供实用解决方案。

7z8x2c4v6b9的博客 194

python 多线程和协程结合_看几段爬虫代码,详解Python多线程、多进程、协程

编程派”,选择设为“”优质文章,第一时间送达!一、前言很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用多进程、多线程、协程来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。二、同步首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返回状态码,其中parse_1...

weixin_39844267的博客 130

Altium Designer操作技巧(12)——如何进行邮票孔拼版?

【摘要】本文详细介绍了PCB设计中邮票孔拼板的全流程操作方法。首先解释了邮票孔拼板的定义、核心目的(提高贴片效率、方便生产)和适用场景(异形板、V-CUT无法实现的情况)。重点阐述了关键设计参数,包括孔径、数量、间隙等规范要求,并提供了两种具体操作方案:传统复制粘贴法和新版阵列放置法。文章通过图文详细演示了从PCB复制、邮票孔添加、板框定义到定位孔和Mark点设置的完整步骤,最后强调了对称性、非金属化孔等设计要点,以及需要与板厂确认工艺参数等注意事项。

u012526819的博客 1679

Rk3128投影仪救砖操作和固件分享思路

大家搞一条比较硬的东西,插入耳机口,就可以进入刷机模式了的,我的机器是这样的,大家也可以试试。(看不懂可以往下看)

MMX7088的博客 1万+

python 协程可以嵌套协程吗_看几段爬虫代码,详解Python多线程、多进程、协程...

点击上方“编程派”,选择设为“设为星标”优质文章,第一时间送达!一、前言很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用多进程、多线程、协程来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。二、同步首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返...

weixin_39637386的博客 312

Python全栈入门到实战【进阶篇 1】类与对象:面向对象编程的基石

Python中定义类使用**class关键字**,创建对象使用**类名()**(类似调用函数),语法简洁,我们从最基础的空类开始,逐步拆解。class# 定义空的学生类,pass表示占位,无实际内容 class Student : pass编码规范:类名遵循大驼峰命名法(每个单词首字母大写,无下划线),如StudentCarPhone,这是Python官方推荐的PEP8规范,便于区分类和其他标识符。实例方法必须定义在类内部;实例方法的第一个参数必须是self(名称可自定义,如this。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 3409

Python并发编程(2)——初始多线程

什么是多线程?为什么需要多线程?多线程的优点和缺点?技术不是也不能成为空中楼阁,技术一定是要为需求服务的,什么有用,才去用什么。那么多线程对于编程人员来说,有用吗?肯定是有用,而且有大用,这是程序员从初级走向高级的重要标志之一。现在开始我们以世界上最流行的语言之一,Python为例,介绍一下多线程。多线程到底是什么呢?百科上面对于多线程的定义是指从软件或者硬件上实现多个线程并发执行的技术。多线程在计算机术语中也可以叫并发,指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。

一点 1382

PyTorch深度学习实战(39)——少样本学习(Few-shot Learning)

小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分类和推理的问题。在小样本学习中,我们希望通过利用已有的少量样本和先验知识来进行泛化,以便在面对新的、未见过的类别时能够做出准确的预测。这就要求模型能够从有限的训练样本中提取出有用的信息,并能够将这些信息应用到新类别的样本中去。在本节中,将介绍孪生、原型和关系网络的原理,并使用 PyTorch 实现孪生网络。

盼小辉丶的博客 1万+

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4346

为什么Python中的多线程是伪并发,但在高IO下能做到并发呢

CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。简单说就是CPU的执行时间占程序运行的大部分时间,小部分时间进行磁盘读写. IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,此时,系统运作,大部分的状况是CPU在等I/O (硬盘/内存) 的读/写操作

Allennnnnnnnnn的博客 584

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python多线程并发调用Qwen-Image接口的压力测试

本文介绍如何使用Python多线程对Qwen-Image文生图接口进行压力测试,评估其在高并发下的响应延迟、成功率与稳定性。通过ThreadPoolExecutor模拟并发请求,结合线程安全控制与性能指标采集,实现轻量高效的压测方案,适用于AI服务性能验证与可观测性建设。

weixin_33431149的博客 1246

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

你知道进程、线程、协程的区别吗?一文搞懂为什么python的 8 线程会比单线程还慢

本文探讨了进程、线程和协程的区别,并解释为何Python多线程可能比单线程更慢。进程是资源隔离的独立单位,拥有独立内存空间,创建和切换成本较高;线程共享进程资源,更轻量但存在竞态条件风险。Python受GIL(全局解释器锁)限制,多线程在CPU密集型任务中无法真正并行,仅适用于I/O密集型场景。建议根据任务类型选择并发模型:CPU密集型用多进程(如PyTorch DataLoader),I/O密集型可用协程(asyncio)或多线程。Python 3.13将实验性支持无GIL模式,可能改善未来并发性能。

weixin_68710508的博客 390

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Python、JavaScript、C++小游戏代码对比:猜数字、贪吃蛇与井字棋实战

编程语言是实现计算逻辑的核心工具,其语法特性和运行原理决定了代码的组织与执行方式。理解不同语言的设计哲学,对于提升工程实践能力至关重要。Python以其简洁的语法和强大的标准库,擅长快速原型开发;JavaScript基于事件驱动和非阻塞I/O模型,在构建交互式应用方面优势明显;C++则通过静态类型和手动内存管理,提供了对系统资源的精细控制。这些特性直接影响了它们在游戏开发等具体场景中的应用策略。例如,通过实现经典的猜数字、控制台贪吃蛇和井字棋游戏,可以直观对比Python的异常处理、JavaScript的异

weixin_42662293的博客 279

Python+FFmpeg打造轻量级音频处理工具:HzChopGUI_Python实战指南

音频处理是多媒体开发与内容创作中的基础需求,涉及音频文件的切割、合并、格式转换与音量调整等核心操作。其底层原理通常依赖于专业的音视频编解码库,通过命令行工具实现高效处理。在技术价值上,将复杂的命令行操作封装为图形界面,能极大降低使用门槛,提升日常工作效率。典型的应用场景包括:从长音频中提取片段用于学习研究、为系列视频内容批量添加片头音乐、转换音频格式以适应不同平台要求,以及为语音识别等应用快速生成测试样本。本文介绍的HzChopGUI_Python项目,正是基于Python的Tkinter库与强大的FFmp

迷彩风情 466

又来爬小说了,纯原创

最近发现一个手机在线看小说的网站,里面没有任何广告,先上链接地址: https://m.lread.net/ 然后在线看起来也是挺累,还是下载txt用掌阅书城app看单机小说有趣,想办法爬下来。 爬个小说本来就不是什么难受,现在问题是这个网站的小说做了页面做了分段处理,一个网页是没法拿到整篇小说的源码的。人家把一篇小说分成多个html页面储存了,而且你还得不到这篇小说的所有html页面,主页...

qq_32394351的博客 6167
上一篇: JDK 20安装教程
下一篇: Python自动玩游戏的三个练习项目
大模型应用场景
博客等级 码龄5年 7671粉丝 1350原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值