码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 你的 Python 代码太慢了吗?协程和多线程来拯救!


    目录

    协程(Coroutine)

    多线程(Multithreading)

    协程与多线程的原理

    协程的原理

    多线程的原理

    实践案例

    使用协程案例

    使用多线程案例



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

    协程(Coroutine)

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

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

    多线程(Multithreading)

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

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

    协程与多线程的原理

    协程的原理

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

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

    多线程的原理

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

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

    实践案例

    使用协程案例

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

    1. import asyncio
    2. async def fetch_data():
    3. print("开始获取数据...")
    4.     await asyncio.sleep(2)
    5. print("数据获取完毕")
    6. return"数据"
    7. async def main():
    8.     tasks =[fetch_data(), fetch_data(), fetch_data()]
    9.     results = await asyncio.gather(*tasks)
    10. print(results)
    11. asyncio.run(main())

    图片

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

    使用多线程案例

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

    1. import threading
    2. import time
    3. def fetch_data():
    4. print("开始获取数据...")
    5.     time.sleep(2)
    6. print("数据获取完毕")
    7. threads =[]
    8. for i in range(3):
    9.     thread = threading.Thread(target=fetch_data)
    10.     threads.append(thread)
    11.     thread.start()
    12. for thread in threads:
    13.     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

     

  • 相关阅读:
    pgsql 主从搭建
    c++引入ros库,以及编写c++版本的ros案例代码
    Springboot萌宠社交分享系统的设计与实现hfdwz计算机毕业设计-课程设计-期末作业-毕设程序代做
    Java设计模式之状态模式
    uni-admin 利用云数据表自动生成页面
    【HBZ分享】Netty的启动引导类Bootstrap
    shell_56.Linux永久重定向
    通过内网穿透实现远程连接群晖Drive,轻松实现异地访问群晖NAS
    SpringBoot调用ChatGPT-API实现智能对话
    5_SqlSugar实体中的细节
  • 原文地址:https://blog.csdn.net/xyh2004/article/details/140064706
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号