你的 Python 代码太慢了吗?协程和多线程来拯救!

目录

协程(Coroutine)

多线程(Multithreading)

协程与多线程的原理

协程的原理

多线程的原理

实践案例

使用协程案例

使用多线程案例



大家好,在Python编程中,处理并发任务时,我们经常会遇到协程和多线程这两个术语。虽然它们的目的相似——即优化程序的执行效率和响应速度,但它们的工作方式却有很大的不同。

协程(Coroutine)

协程是一种比线程更加轻量级的并发实现方式。它们允许你在一个函数中暂停执行,然后在需要时继续执行。这就像是你在看一本书的时候,可以在任何页面放一个书签,然后在以后继续阅读。

Python中的协程通常通过asyncio库来实现。协程可以让你编写出更加简洁和高效的异步代码。

多线程(Multithreading)

多线程是指在同一个进程中运行多个线程,每个线程执行不同的任务。线程就像是一个个小工人,他们可以同时工作,但他们共享同一个资源池(比如内存)。在Python中,可以通过threading库来实现多线程。

多线程适用于I/O密集型任务,比如文件读取、网络请求等。因为这些任务通常会等待外部资源的响应,而在等待期间,线程可以去执行其他任务,提高整体效率。

协程与多线程的原理

协程的原理

协程的核心在于其异步性。它们通过asyncawait关键字实现。一个协程函数使用async def来定义,并在需要暂停的地方使用await来等待其他协程的完成。

协程的运行方式类似于单线程,但它们在等待I/O操作时可以暂停,允许其他协程运行。这种方式避免了线程间切换的开销,同时也避免了锁机制的问题。

多线程的原理

多线程的实现依赖于操作系统的线程调度机制。每个线程都有自己的执行路径,但它们共享同一个进程的内存空间。

Python的GIL(全局解释器锁)限制了同一时刻只能有一个线程执行Python字节码,这使得多线程在CPU密集型任务上的表现不如预期。但在I/O密集型任务中,多线程仍然能显著提升性能。

实践案例

使用协程案例

让我们来看一个简单的协程示例,通过asyncio库来实现:

import asyncio

async def fetch_data():
print("开始获取数据...")
    await asyncio.sleep(2)
print("数据获取完毕")
return"数据"

async def main():
    tasks =[fetch_data(), fetch_data(), fetch_data()]
    results = await asyncio.gather(*tasks)
print(results)

asyncio.run(main())

图片

在这个例子中,我们定义了一个异步函数fetch_data,它模拟了一个数据获取的过程。asyncio.sleep(2)模拟了一个异步等待操作。在main函数中,我们使用asyncio.gather并行执行了三个fetch_data任务。

使用多线程案例

接下来,我们来看一个多线程的示例,通过threading库来实现:

import threading
import time

def fetch_data():
print("开始获取数据...")
    time.sleep(2)
print("数据获取完毕")

threads =[]
for i in range(3):
    thread = threading.Thread(target=fetch_data)
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

图片

在这个例子中,我们定义了一个普通的函数fetch_data,它同样模拟了一个数据获取的过程。我们创建了三个线程,并分别启动它们。最后,我们使用join方法等待所有线程执行完毕。

通过本文的讲解,我们了解了协程和多线程的基本概念和原理,并通过代码示例演示了它们的使用方式。

  • • 协程:适用于需要处理大量异步I/O操作的场景,通过asyncio库实现。

  • • 多线程:适用于I/O密集型任务,通过threading库实现,但受限于Python的GIL,在CPU密集型任务上表现不佳。

希望通过这篇文章,你对协程与多线程有了更清晰的理解,并能在实际项目中灵活运用它们,提高程序的并发性能。

用Nuitka打包 Python,效果竟如此惊人!_nuitka --optimization 优化等级-CSDN博客文章浏览阅读933次,点赞23次,收藏18次。Nuitka 是一个 Python 到 C 的编译器,它会将 Python 代码转换为等效的 C 代码,然后使用标准的 C 编译器(如 GCC)将其编译为二进制可执行文件。这一过程不仅提高了程序的执行效率,还能通过编译后的二进制文件保护代码的隐私。_nuitka --optimization 优化等级https://blog.csdn.net/xyh2004/article/details/139858171
Python运算符重载,代码秒变高大上!_py 重载运算符-CSDN博客文章浏览阅读983次,点赞21次,收藏25次。运算符重载是面向对象编程中的一项重要特性,它允许程序员为自定义的数据类型(如类)重新定义标准运算符的行为。这意味着,对于加号+、减号-等运算符,我们可以在不同类型的对象间赋予其特定的操作意义,而不局限于基本数据类型的操作。例如,在自定义的复数类中,我们可以重载+运算符,使其能够实现复数的加法操作。_py 重载运算符https://blog.csdn.net/xyh2004/article/details/139830303
Python高效内存访问,memoryview这个神器你值得拥有!_python memoryview-CSDN博客文章浏览阅读1.1k次,点赞35次,收藏13次。memoryview是Python中用于访问数组缓冲区的一个高级接口,它提供了直接、高效的内存访问方式 ,而无需复制底层数据。这使得memoryview成为处理大型数据集或在对性能敏感的应用中进行内存操作的理想选择。它支持的数据类型包括但不限于bytes、bytearray以及NumPy数组等,能够直接映射到这些对象的内存上进行读写操作。_python memoryviewhttps://blog.csdn.net/xyh2004/article/details/139880717

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM大模型:如何选择合适的 Embedding 模型?

检索增强生成(RAG)是生成式 AI (GenAI)中的一类应用,支持使用自己的数据来增强 LLM 模型(如 ChatGPT)的知识。 RAG 通常会用到三种不的AI模型,即 Embedding 模型、Rerankear模型以及…

数据质量管理-时效性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档,当前数据质量评价指标框架中包含6评价指标,在实际的数据治理过程中,存在一个关联性指标。7个指标中存在4个定性指标,3个定量指标; 定性指标&am…

视频号视频怎么保存到手机,视频号视频怎么保存到手机相册里,苹果手机电脑都可以用

随着数字媒体的蓬勃发展,视频已成为我们日常生活中不可或缺的一部分。视频号作为众多视频分享平台中的一员,吸引了大量用户上传和分享各类精彩视频。然而,有时我们可能希望将视频号上的视频下载下来,以下将详细介绍如何将视频号的视频。 方法…

[DASP]玩机!在组织一套音频系统之前,我们先要知道这套系统里面有什么东西。

前言 现在不是搞音频嘛,正好自己买了无源音箱,买了套DSP芯片玩一下 流程 上图是我们组织一套音频系统的流程,首先我们需要知道各个元件是做什么的 1. 音源(例如麦克风、音乐播放器等): 产生模拟音频信号…

无忧易售新功能:一键白底转换,升级产品图片质感

在电商领域不断追求卓越与效率的今天,无忧易售ERP推出一键白底转换功能,为卖家们提供前所未有的便捷与高效,改变了商品图片处理的传统模式,革新了卖家们的图片处理体验,让商品展示焕然一新,助力商家在激烈的…

Java--常用类APl(复习总结)

前言: Java是一种强大而灵活的编程语言,具有广泛的应用范围,从桌面应用程序到企业级应用程序都能够使用Java进行开发。在Java的编程过程中,使用标准类库是非常重要的,因为标准类库提供了丰富的类和API,可以简化开发过…

Softmax函数的作用

Softmax 函数主要用于多类别分类问题,它将输入的数值转换为概率分布。 具体来说,对于给定的输入向量 x [x_1, x_2,..., x_n] ,Softmax 函数的输出为 y [y_1, y_2,..., y_n] ,其中: 这样,Softmax 函数的输…

python selenium 打开网页

selenium工具类 - 文件名 seleniumkit.py 代码如下 # -*- coding:utf-8 _*-from selenium import webdriverimport os import timefrom selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from seleniu…

【Linux】解锁并发:多线程同步技术详解与应用实践

文章目录 前言:1. 同步概念2. 条件变量:实现线程间同步的!2.1. 条件变量是什么?2.2. 认识条件变量接口 3. 写一个测试代码——验证线程的同步机制4. 生产消费模型5. 生产消费模型 条件变量6. 线程池7. 可重入 VS 线程安全7.1. 概…

ModuleNotFoundError: No module named ‘_sysconfigdata_x86_64_conda_linux_gnu‘

ModuleNotFoundError: No module named _sysconfigdata_x86_64_conda_linux_gnu 1.软件环境⚙️2.问题描述🔍3.解决方法🐡4.结果预览🤔 1.软件环境⚙️ Ubuntu 20.04 Python 3.7.0 2.问题描述🔍 今天发现更新conda之后&#xff0…

【Python机器学习】分类向量——One-Hot编码(虚拟变量)

为了学习分类特征,以某国成年人收入数据集(adult)为例,adult数据集的任务是预测一名工人的收入是高于50k还是低于50k,这个数据集的特征包括工人的年龄、雇佣方式、教育水平、性别、每周工作时长、职业等。 这个任务属于…

第二届Godot游戏开发大赛来啦!

第二届Godot游戏开发大赛来啦! 我们的开发大赛正式定名为Godot Hub Festival 2024,以后将按照年份命名。 另外,本次比赛将和openKylin开源社区的SIG组们合作举办(因此也可以叫Godot openKylin开发大赛)。比赛定于2024年7月1日正式开始&#x…

基于Java的旅游景区网站系统(springboot+vue)

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

瑞数(rs6)接口以及源码

测试代码截图如下:调用接口即可直接用 需要dd 有想要学习教程的也能够找我。 如有需求,欢迎+我绿泡泡。 期待你的加入!

访问外网的安全保障——反向沙箱

反向沙箱作为一种网络安全技术,其核心理念在于通过构建一个隔离且受控的环境,来有效阻止潜在的网络威胁对真实系统的影响。在当今日益复杂的网络环境中,如何借助反向沙箱实现安全上网,已成为众多用户关注的焦点。 随着信息化的发…

服务器数据恢复—异常断电导致RAID6阵列中磁盘出现坏扇区的数据恢复案例

服务器存储数据恢复环境: 一台存储中有一组由12块SAS硬盘组建的RAID6磁盘阵列,划分为一个卷,分配给几台Vmware ESXI主机做共享存储。该卷中存放了大量Windows虚拟机,这些虚拟机系统盘是统一大小,数据盘大小不确定&…

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述:word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。设置了页边距也不管用。 如图1 图1 解决: 点击“视图”——“多页”——“单页”,即可。如图2操作 图2 结果展示:如图3 图3

Nginx 1.26.1最新版部署笔记

Nginx是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 以下是 Nginx 的一些核心功能和特点: 高性能的 Web 服务器: Nginx 被设计为处理高并发连接,具有非常高的性能和稳定性。反向代理: …

运维锅总详解Nginx

本文尝试从Nginx特性及优缺点、为什么具有文中所述的优缺点、Nginx工作流程、Nginx最佳实践及历史演进等角度对其进行详细分析。希望对您有所帮助。 Nginx特性及优缺点 Nginx简介 Nginx(发音为 “engine-x”)是一款高性能的开源Web服务器及反向代理服…

【折腾笔记】兰空图床使用Redis做缓存

前言 最近发现我部署在群晖NAS上的兰空图床程序在高并发的情况下会导致图片加载缓慢或出现图片加载失败的情况,于是我查阅了官方文档资料并进行了一系列的测试,发现兰空图床如果开启了原图保护功能,会非常的吃CPU的性能,尤其是在…