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

Python的单线程和多线程 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 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方优快云官方认证二维码或者点击链接免费领取【保证100%免费】

点击免费领取《优快云大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

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

相关推荐

导数与微分在 FPS 射击游戏中的实际应用:把“手感”算出来

摘要:射击游戏开发中,单线程适用于简单小游戏(如单机打靶),所有任务由主线程顺序处理,代码简单但效率较低;多线程则适合复杂场景(如多人在线3D大作),通过渲染、逻辑、网络、音效等线程分工协作,确保画面流畅、响应迅速和实时同步。选择依据取决于游戏复杂度、联网需求和性能要求,小型游戏用单线程,大型高要求项目必须采用多线程架构。(149字)

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 3278

Python单线程/多线程

Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作! 利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是单线程。 import threading import time def test1(): for i in range(10000000): a = 100 - i def test2(): threads = [] t1 = threading.Thread(target=test1.

文静是个小菜鸟的博客 3046

nacos3.1.0适配国产数据库

Nacos 3.1.0适配国产数据库指南 本文介绍了Nacos 3.1.0版本适配达梦数据库和人大金仓数据库的具体步骤。主要内容包括:添加达梦和人大金仓的JDBC驱动依赖,修改nacos-persistence模块的配置文件及相关Java类,以及打包和运行注意事项。文章特别指出3.1.0版本需要JDK17环境,并提供了解决常见问题的建议,如添加VM options配置和不同启动方式等。通过本文的配置指导,可以实现Nacos服务在国产数据库环境下的正常运行。

梦昼初的博客 1466

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

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

wadfdhsajd的博客 332

LVI-SAM适配KITTI数据集避坑指南:IMU频率与数据同步问题解析

本文深入解析了将LVI-SAM框架适配KITTI数据集时,在IMU频率与多传感器数据同步方面遇到的核心挑战与解决方案。针对KITTI数据集中sync与extract两种数据包的差异,文章提供了从数据选择、参数调优到时间戳诊断与修复的完整避坑指南,帮助开发者实现稳定高效的SLAM系统部署。

7z8x2c4v6b9的博客 247

域自适应的理解与想法(Domain Adaptation)

这幅图是域适应非常有名的一篇论文中的插图,被很多文章转载。 什么是领域自适应? Domain Adaptation是迁移学习中很重要的一部分内容,目的是把分布不同的源域和目标域的数据,映射到一个特征空间中,使其在该空间中的距离尽可能近。于是在特征空间中对source domain训练的目标函数,就可以迁移到target domain上,提高target domain上的准确率。 上面的图主要的思想来源于GAN,上图由三部分组成:特征映射网络 标签分类网络和和域判别网络 其中,source domain的数.

yuanxue18的博客 5982

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

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

weixin_39886619的博客 100

SAP 资产主数据屏幕增强:对比字段追加与子屏幕/页签 2 种方案优劣

本文深入对比了SAP资产主数据(AS01/AS03)屏幕增强的两种方案:字段追加与子屏幕/页签。从技术实现、业务适配、系统维护等维度分析各自优劣,提供方案选型决策树和混合方案实践建议,帮助企业在SAP实施中做出最优选择。

weixin_28559803的博客 284

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

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

weixin_39844267的博客 130

Shell编程规范及变量

文章目录一.Shell脚本1.1Shell概述1.2Shell脚本 一.Shell脚本 1.1Shell概述 Shell是Linux系统中开机自动加载的一个特殊程序,它将用户输入的指令,转换成Linux内核可以识别的语言,从而让内核执行调用硬件。 Bash是Linux系统中默认使用shell的程序,它位于/bin/bash。 1.2Shell脚本 将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的 ...

夏颜的博客 3676

用逐飞STC32G库做个智能小车:编码器测速、PWM调电机、ADC读电池电压(完整项目)

本文详细介绍了如何使用逐飞科技的STC32G12K128开源库构建智能小车项目,涵盖编码器测速、PWM电机控制和电池电压监测等核心功能。通过硬件选型、开发环境搭建、代码实现及调试技巧的全流程讲解,帮助开发者快速掌握基于STC32G的嵌入式系统开发,实现高性能的智能小车控制。

weixin_42526417的博客 194

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

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

weixin_39637386的博客 304

从询价到回款:一篇讲透 SAP SD 销售与分销的实战入门指南

摘要: SAP SD(Sales and Distribution)模块是SAP ERP中管理销售与分销的核心组件,贯穿从订单到回款(Order-to-Cash)的全流程。其核心价值在于将销售业务结构化,通过主数据(客户、物料、定价)和交易单据(订单、交货、发票)实现流程可审计、可自动化。SD模块与物流(MM)、生产(PP)、财务(FI)深度集成,涵盖定价策略、信用控制、发运管理、国际贸易等复杂场景。关键设计包括条件技术(Condition Technique)实现灵活定价,单据流(Document Flo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

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

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

一点 1382

笔试题-2023-芯动-数字IC设计【纯净题目版】

笔试题-2023-芯动-数字IC设计【纯净题目版】

w0shishabi的博客 6396

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

Allennnnnnnnnn的博客 584

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

weixin_33431149的博客 1246

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

weixin_68710508的博客 390

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

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
上一篇: 从月薪2300到年薪180万,流水线厂妹变身谷歌工程师,她靠什么逆天改命?
下一篇: 常用 Python IDE 汇总(非常详细)从零基础入门到精通,看完这一篇就够了
网络安全_入门教程
博客等级 码龄4年 1万+粉丝 2151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值