Python. 协程asyncio、gevent

1、协程是一种轻量级的并发机制,允许你在单个线程内模拟并发执行多个任务。协程非常适合用于 I/O 密集型任务,如网络请求、文件读写等,在等待 I/O 操作完成时,协程可以继续执行其他任务而不是阻塞。

  1. 生成器:

    • 协程的基础是生成器(generator)。生成器是一种特殊的迭代器,它可以使用 yield 表达式暂停其执行,并在后续调用 next() 方法时恢复执行。
    • 生成器可以使用 yield 表达式返回一个值,并保存当前的状态,以便下次调用时可以从上次暂停的地方继续执行。
  2. 异步编程:

    • 协程可以用来编写异步代码,这样就可以在等待某些操作(如 I/O 操作)完成时执行其他任务。
    • Python 3.5 引入了 asyncio 模块,提供了协程和异步编程的支持。
  3. 关键字 asyncawait:

    • async def 用于定义一个协程函数。
    • await 用于在协程函数内部等待另一个协程的完成。
      import asyncio# 定义一个协程函数
      async def task(name, delay):print(f"{name} task starts.")await asyncio.sleep(delay)  # 模拟一个异步操作print(f"{name} task finishes.")async def main():# 创建并启动两个任务task1 = asyncio.create_task(task("Task 1", 2))task2 = asyncio.create_task(task("Task 2", 1))# 等待所有任务完成# await task1# await task2await asyncio.gather(task1, task2)# 运行协程
      asyncio.run(main())

2、gevent 是一个 Python 库,它提供了一种轻量级的并发机制,使用 greenlets(绿色线程)来实现协程 

gevent 的特点

  1. 轻量级:

    • gevent 的 greenlets 是轻量级的,可以在单个线程内运行多个 greenlets。
  2. 非抢占性调度:

    • greenlets 的调度是非抢占式的,这意味着一个 greenlet 只能在遇到 switch 方法时主动让出控制权。
  3. 共享内存:

    • greenlets 共享相同的内存空间,这意味着它们可以直接访问相同的变量和数据结构。
  4. 适合 I/O 密集型任务:

    • gevent 非常适合处理 I/O 密集型任务,如网络请求、文件读写等。在等待 I/O 操作完成时,greenlet 可以继续执行其他任务。
  5. 异步编程:

    • gevent 提供了一种自然的方式来编写异步代码,使得代码更容易理解和维护。
  6. 自动猴子补丁:

    • gevent 提供了一个“猴子补丁”(monkey patching)功能,可以将 Python 的标准库中的阻塞调用替换为非阻塞的版本。
from gevent import monkey; monkey.patch_all()  # 必须在导入其他库之前执行
import gevent
import requestsdef fetch_url(url):print(f"Fetching {url}...")response = requests.get(url)print(f"Fetched {url}: {len(response.text)} bytes")def main():urls = ["https://www.example.com","https://www.example.org","https://www.example.net"]greenlets = [gevent.spawn(fetch_url, url) for url in urls]gevent.joinall(greenlets)if __name__ == "__main__":start_time = time.time()main()end_time = time.time()print(f"Total time taken: {end_time - start_time:.2f} seconds")

代码解释

  1. Monkey Patching:

    • monkey.patch_all() 用于自动将标准库中的阻塞调用替换为 gevent 的非阻塞版本。这是为了让 gevent 能够接管标准库中的网络请求等 I/O 操作。
  2. 定义 greenlet 函数:

    • fetch_url 函数接受一个 URL 参数,并使用 requests.get() 发送网络请求。
  3. 创建并启动 greenlets:

    • 使用 gevent.spawn() 来创建并启动 greenlets。
    • gevent.joinall() 用于等待所有 greenlets 完成。
  4. 性能测量:

    • 使用 time.time() 来记录开始和结束时间,计算总的执行时间。

gevent 与 asyncio 的区别

  • 实现方式:

    • gevent 由 gevent 库提供支持,使用 gevent.greenlet.Greenlet 类。
    • asyncio 是 Python 3.5+ 中的原生特性,使用 async/await 关键字。
  • 调度方式:

    • gevent 的调度是由 gevent 库控制的。
    • asyncio 的调度是由 Python 的异步运行时(如 asyncio)控制的。
  • 异步支持:

    • gevent 需要使用 monkey patching 来使标准库中的 I/O 操作变为非阻塞。
    • asyncio 通常与 asyncio 一起使用,提供了一套完整的异步编程模型

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

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

相关文章

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑦ | 11.18 - 11.20

前言 第11章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.18 规划风险管理 11.18.1 风险基本概念 11.18.2 主要输入 11.18.3 主要输出 11.19 识别风险 11.19.1 主…

算法入门:Java实现排序、查找算法

链接:算法入门:Java实现排序、查找算法 (qq.com) 冒泡/选择/插入/希尔排序代码 (qq.com) 快排/归并/堆排/基数排序代码 (qq.com)

棋子豆:西北风味的绝妙演绎

棋子豆,形状小巧如棋子,却蕴含着大大的美味。它选用了西北地区特有的优质面粉,融合了当地传统的制作工艺。在烘烤的过程中,豆子逐渐变得金黄酥脆,散发出诱人的香气。 轻轻咬上一口,“嘎嘣”作响&…

电脑桌面录屏怎么录?分享这四款软件!

在这个数字化时代,无论是教学分享、游戏直播还是会议记录,电脑桌面录屏都成为了我们日常工作和娱乐中不可或缺的一部分。但面对琳琅满目的录屏软件,如何挑选出既高效又易用的那一款呢?别急,今天就为大家揭秘四款超实用…

Java面试八股之Spring DAO的作用

Spring DAO的作用 Spring DAO (Data Access Object) 是 Spring 框架的一个重要组成部分,它提供了一套用于简化数据访问操作的抽象层。Spring DAO 的核心目的是使开发人员能够更容易地处理数据访问相关的异常,并提供一致的异常处理机制,同时简…

文件描述符(fileno)及文件系统

fileno: #include <stdio.h> main() {FILE *fp;int fd;fp fopen("/etc/passwd", "r");fd fileno(fp);printf("fd %d\n", fd);fclose(fp); } 一&#xff0e;fileno()函数-CSDN博客https://blog.csdn.net/TuxedoLinux/article/detai…

七夕告白攻略:天使智能体教你如何设计完美表白卡片!独属程序员地浪漫!

文章目录 &#x1f495;七夕浪漫告白天使&#x1f495;&#x1f495;浪漫风格的表白卡片设计&#x1f495;&#x1f495;甜蜜风格的表白卡片设计&#x1f495;&#x1f495;温馨风格的表白卡片设计&#x1f495;&#x1f495;幽默风格的表白卡片设计&#x1f495;&#x1f495;…

51、PHP 实现简单的快速排序

题目&#xff1a; PHP 实现简单的快速排序 描述&#xff1a; function simpleQuickSort(array $list) {$length count($list);if( $length < 1){return $list;}else{$pivot $list[0];$left_list array();$right_list array();for($i 1; $i < $length; $i){if($lis…

MySQL学习(16):视图

视图是一种虚拟临时表&#xff0c;并不真正存储数据&#xff0c;它的作用就是方便用户查看实际表的内容或者部分内容 1.视图的使用语法 &#xff08;1&#xff09;创建 create view 视图名称 as select语句; #视图形成的虚拟表就来自于select语句所查询的实际表&#xff0c;…

Vue使用阿里巴巴字体

阿里巴巴字体使用效果 字体包下载 官方下载链接 解压字体文件到指定的文件夹 引用字体文件 我的是uniApp的项目&#xff0c;所以在公共css样式中引用这个字体文件 /*每个页面公共css */ font-face {font-family: "alimamFont";font-weight: 400;src: url("~/s…

Fiddler Mock测试详解

在软件开发过程中&#xff0c;Mock测试是一种非常有效的测试方法&#xff0c;特别是在处理复杂依赖或尚未完成的服务时。Fiddler作为一款强大的网络抓包工具&#xff0c;也提供了Mock测试的功能&#xff0c;允许开发者在不实际调用后端接口的情况下&#xff0c;模拟接口响应&am…

将YOLOv8模型从PyTorch的.pt格式转换为TensorRT的.engine格式

TensorRT是由NVIDIA开发的一款高级软件开发套件(SDK)&#xff0c;专为高速深度学习推理而设计。它非常适合目标检测等实时应用。该工具包可针对NVIDIA GPU优化深度学习模型&#xff0c;从而实现更快、更高效的运行。TensorRT模型经过TensorRT优化&#xff0c;包括层融合(layer …

为什么创业初期的ToB公司都要“交点学费”

“企业交学费”&#xff0c;本质上来说&#xff0c;就是企业成长中绕不开的“试错成本”&#xff0c;只能降低&#xff0c;无法完全避免。 但是&#xff0c;对于ToB初创企业来说&#xff0c;这个问题就相对棘手了。一是这个“费用”不可避免。二来&#xff0c;初创企业本来就没…

算法——二分查找(day10)

目录 69. x 的平方根 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; 35. 搜索插入位置 题目解析&#xff1a; 算法解析&#xff1a; 代码&#xff1a; 69. x 的平方根 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 老…

构建未来智能:在Mojo模型中自定义模型架构的艺术

构建未来智能&#xff1a;在Mojo模型中自定义模型架构的艺术 在深度学习的世界里&#xff0c;模型架构的设计往往决定了算法的性能和适用性。Mojo模型&#xff0c;作为一个假想中的高级机器学习框架&#xff0c;允许用户实现自定义的模型架构来解决特定的问题。本文将深入探讨…

解决学生技能短板:泰迪智能科技2024年中职大数据实验室,全面提升学生实践能力

一、中职院校现状及实验室建设背景 在当今信息化时代&#xff0c;大数据技术已成为国家战略发展的重要方向。中职院校作为我国职业教育体系的重要组成部分&#xff0c;肩负着培养高素质技术技能人才的重任。然而&#xff0c;目前我国中职院校在大数据教育方面存在以下问题&…

一种docker start放回Error response from daemon: task xxx错误的解决方式

1. 问题描述 执行systemctl daemon-reload与systemctl restart docker命令后&#xff0c;发现docker中有的应用无法启动&#xff0c;并显示出Exit(255)的错误提示。 重新执行docker start 容器id后发现返回&#xff0c;Error response from daemon: task xxx的错误。 2. 问题…

2024巴黎奥运会:黑科技引领未来体育盛宴,创新技术点亮全球观众体验

在2024年巴黎奥运会上&#xff0c;黑科技的应用成为了引人注目的亮点。这些黑科技不仅提升了赛事的观赏性、体验度和组织效率&#xff0c;还展现了全球科技公司在前沿技术领域的创新能力。以下是一些主要的黑科技应用&#xff1a; 1. 超高清视频制作与传输 4K超高清三维声制作…

学习日志:双亲委派模型

文章目录 前言一、双亲委派模型二、双亲委派模型的执行流程三、双亲委派模型的好处四、打破双亲委派模型方法 前言 类加载器有很多种&#xff0c;当我们想要加载一个类的时候&#xff0c;具体是哪个类加载器加载呢&#xff1f;这就需要提到双亲委派模型了。 ClassLoader 类使用…

C++ | QQ后端暑期实习面试

tcp三次握手&#xff0c;四次挥手 断点续传 文件断点续传是一种机制&#xff0c;允许在网络传输中的文件传输过程中出现断开连接或传输中断的情况下&#xff0c;能够恢复传输并继续传输未完成的部分。其原理如下&#xff1a; 检测支持&#xff1a;首先&#xff0c;服务器端和…