python协程—asyncio模块

news2025/1/11 2:40:26

目录

什么是协程

协程的特点

为什么使用协程

asyncio协程模块

多任务的协程

总结


什么是协程

协程(Coroutine)是一种并发编程的技术,它允许程序在执行过程中暂停和恢复。协程可以看作是一种特殊的函数,它可以暂停执行,执行其他任务,然后再恢复到暂停的地方继续执行。与线程或进程相比,协程具有更小的开销和更高的执行效率。

协程的特点

1. 可以暂停和恢复:协程在执行过程中可以主动暂停,将控制权交给其他协程或任务执行。等到合适的时机,协程可以恢复执行,继续之前暂停的地方执行。

2. 轻量级:协程相对于线程或进程来说,占用的资源更少,创建和切换的开销更小。因此可以同时创建大量的协程而不会造成资源的浪费。

3. 协作性:协程之间可以通过交互式地暂停和恢复执行来进行协作。协程可以在特定的点上交出控制权,其他协程可以获得执行机会,从而实现任务的协作和并发执行。

为什么使用协程

使用协程的主要原因是为了提高并发性能和改善异步编程的开发体验。以下是一些使用协程的好处:

1. 高效利用资源:协程在执行过程中可以主动暂停和恢复,避免了线程或进程在等待IO操作时的空闲浪费。通过协程,可以在等待IO操作完成时切换到执行其他任务,从而更高效地利用计算资源。

2. 简化异步编程逻辑:传统的异步编程模型常常需要使用回调函数或者编写复杂的状态机来处理异步任务。而协程则可以使用同步的方式编写异步代码,避免了回调嵌套和复杂的错误处理逻辑,让代码更易读、更易维护。

3. 提高代码可读性和可维护性:协程的代码更类似于同步代码,采用顺序执行的方式编写。这种方式使得代码更易于理解和调试,降低了编写和维护异步任务的难度。

4. 并发性能提升:由于协程的轻量级和高效利用资源的特性,可以同时执行大量的协程,实现高并发执行。相比于线程或进程,协程的切换开销更小,同时可以利用多核CPU进行并发。这使得在处理并发任务时,协程更加高效。

5. 更好的抽象和封装:协程可以将异步操作封装成可复用的任务,提供更好的抽象层级。这样可以使得代码更加模块化,任务之间的依赖关系和调度可以更清晰地表达出来。

asyncio协程模块

协程的代码基本构成通常包括以下几个关键元素:

1. 创建协程对象:首先需要创建一个协程对象,这可以通过特定的语法或库函数来实现。在Python中,可以使用`async def`定义一个协程函数,或者使用`asyncio.create_task()`创建一个协程任务。

2. 执行协程:一旦创建了协程对象,就需要在适当的时机执行它。在Python中,可以通过`await`关键字来执行一个协程,将控制权交还给事件循环(event loop)。

3. 暂停和恢复:协程的特点之一是可以在执行过程中暂停和恢复。在协程函数中,可以使用`await`关键字来暂停当前协程的执行,并等待其他协程或异步操作的完成。一旦等待的条件满足,协程将从暂停的地方继续执行。

4. 异步操作:协程通常会涉及到异步操作,例如网络请求、文件读写等。这些异步操作可以使用特定的库函数或语法来完成,例如在Python中可以使用`await`关键字等待一个异步操作的结果。

5. 协程的调度和并发:多个协程可以同时存在,并通过事件循环的调度来进行切换和执行。事件循环负责协程的调度和并发执行,可以根据需要进行协程的切换,从而实现并发执行的效果。

下面是一个简单的Python协程函数的例子:

import asyncio

async def my_coroutine():
    print("Coroutine started")
    await asyncio.sleep(1)
    print("Coroutine resumed")

async def main():
    print("Main program started")
    task = asyncio.create_task(my_coroutine())  # 创建协程任务
    await task
    print("Main program finished")

asyncio.run(main())  # 执行主协程

在上面的例子中,`my_coroutine`函数是一个协程函数,其中使用了`await`语句来暂停和恢复协程的执行。`main`函数是主协程函数,用于执行协程任务并管理协程的执行顺序。通过`asyncio.create_task()`创建了一个协程任务,并通过`await`等待任务的完成。最后使用`asyncio.run()`来执行主协程。

这是一个简单的协程代码示例,实际的协程代码可能会更加复杂,涉及到更多的异步操作和协程的并发执行。

多任务的协程

在协程中实现多任务(即并发执行多个任务)是协程的一个重要应用场景。通过协程的暂停和恢复特性,可以在同一线程中执行多个协程任务,实现任务的协作和并发执行。

在协程中实现多任务的一种常见方式是使用事件循环(Event Loop),它负责协程的调度和执行。事件循环会不断地从可执行的协程队列中选择一个协程执行,直到所有协程完成或者被暂停。

下面是一个示例代码演示了如何使用事件循环实现多任务的协程:

import asyncio

async def task1():
    print("Task 1 started")
    await asyncio.sleep(1)
    print("Task 1 completed")

async def task2():
    print("Task 2 started")
    await asyncio.sleep(2)
    print("Task 2 completed")

async def main():
    print("Main program started")
    await asyncio.gather(task1(), task2())  # 并发执行两个任务
    print("Main program finished")

asyncio.run(main())  # 运行主协程

在上面的代码中,`task1()`和`task2()`是两个协程函数,分别代表两个任务。`main()`是主协程函数,在其中使用`asyncio.gather()`函数来并发执行两个任务。`await asyncio.gather(task1(), task2())`等待两个任务的完成,然后继续执行后续代码。

通过事件循环(由`asyncio.run(main())`调用)以及`asyncio.sleep()`函数的使用,可以在同一线程内并发执行多个协程任务。事件循环会根据任务的状态(是否被暂停或完成)来调度协程的执行。

需要注意的是,在协程中的阻塞操作(如IO操作)应该使用异步方式完成,以避免阻塞整个事件循环。常用的IO操作库如`asyncio`和`aiohttp`都提供了异步的IO操作支持。

通过使用事件循环和协程,可以方便地实现多任务的协作和并发执行,提高处理并发任务的效率和性能。

总结

协程是一种并发编程的技术,通过允许程序在执行过程中暂停和恢复,实现了高效利用资源、简化异步编程逻辑、提高代码可读性和可维护性、并发性能提升等优势。主要应用场景包括异步编程、事件驱动编程和并发任务调度等。

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

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

相关文章

快速安装Kibana,head插件以及IK分词器

安装Kibana Kibana是基于node.js的,安装这个之前要先安装node.js 1 压缩包下载地址: Kibana 6.2.4 | Elastic 2.将下载的Kibana压缩包解压到任意一个没有中文没有空格的目录下,进入Kibana安装目录下的config目录,修改kibana.yml文件,添加Elasticsearch服…

钳形表校准装置 “定点输出”方式

装置具有“定点输出”方式,通过点击触摸屏,直接设置所需输出的量值,装置将全自动切换至最佳量程输出,使得校准数字式仪表变得非常方便。特别是在设定交流电压/电流输出时,直接同时输入幅值和频率即可,使用十…

【计算机视觉】对比学习综述(自己的一些理解)

对比loss 对比学习的 loss(InfoNCE)即以最 大化互信息为目标推导而来。其核心是通过计算样本表示间的距离,拉近正样本, 拉远负样本,因而训练得到的模型能够区分正负例。 具体做法为:对一个 batch 输入的图…

Tensorflow入门(1)——深度学习框架Tesnsflow入门 环境配置 认识Tensorflow

目录 一、环境配置1.Anaconda以及Tensorflow的安装2.CONDA环境安装3.测试是否成功 二、认识TensorFlow1.图 Graph()2.会话 Session()3.张量 Tensor(1)张量的形状(2)数据类型张量的动态形状与静态形状 4.张量操作(1&…

No9.精选前端面试题,享受每天的挑战和学习

文章目录 从recat源码角度说明下setState流程同源策略限制什么行为computed和watch的区别http和https的区别vue中的route和router的异同点,区别 从recat源码角度说明下setState流程 在 React 的源码中,setState 方法是用于更新组件的状态(st…

java中预览pdf或者图片

GetMapping("preview1")ApiOperation(value "根据文件名实现预览功能")public void previewFile1( HttpServletResponse response) throws IOException {String filePath"C:\\Users\\Harbor Lau\\Desktop\\哈哈\\""11月燃油费(公开).pdf&q…

照片如何恢复?试试这3个简单操作!

我的电脑里保存了很多照片,都是对我来说意义重大的,但最近电脑内存不足了,在清理内存时,我不小心把照片也清空了,这些照片应该如何恢复呢?谁有什么好的方法恢复电脑里的照片吗? 可能很多人都会选…

【UnityDOTS 小知识】RequireMatchingQueriesForUpdate与RequireForUpdate

RequireMatchingQueriesForUpdate与RequireForUpdate 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 一、RequireMatchingQueriesForUpdate 将这个特性放置于System类上…

【算法与数据结构】字符串匹配算法

文章目录 一、暴力穷解法二、KMP算法二、BM算法三、Sunday算法四、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、暴力穷解法 思路分析:首先判断字符串是否合法,然后利用for循环,取出…

2024考研408-操作系统 第一章-计算机系统概述学习笔记

文章目录 前言一、操作系统的基本概述1.1、操作系统的概念1.2、操作系统的功能1.2.1、操作系统提供的功能及示例1.2.2、操作系统提供的方便易用服务1.2.2.1、操作系统刚普通用户使用(GUI用户界面、命令接口)1.2.2.2、给程序员提供的程序接口小总结&#…

Cesium中加载WMS、WMTS、WFS三类服务,并进行点击查询

近期工作中需要使用Cesium加载各类服务,并进行点击查询。故针对不同的服务对加载方法和点击查询方法进行了整理。 一、加载方法 1.1加载WMS export function wmsService(url,layer){let wmsnew Cesium.WebMapServiceImageryProvider({url : url,//如http://106.12…

【Spring Boot】Spring Boot配置文件详情

前言 Spring Boot是一个开源的Java框架,用于快速构建应用程序和微服务。它基于Spring Framework,通过自动化配置和约定优于配置的方式,使开发人员可以更快地启动和运行应用程序。Spring Boot提供了许多开箱即用的功能和插件,包括嵌…

【笔记】微机原理及接口技术4 -- ADC/DAC

模数数模转换器 控制系统中的模拟接口 A/D 转换器 把模拟信号转成数字信号,供微处理器使用; D/A 转换器 输出模拟信号,供外部控制装置使用; D/A 原理 D/A 转换器的主要部件是电阻开关网络 通常是由输入的二进制数的各位控制一些…

EasyCVR如何在不修改分辨率的情况下进行H.265自动转码H.264?

EasyCVR视频融合平台基于云边端一体化架构,可支持多协议、多类型设备接入,在视频能力上,平台可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、H.265转码、智能分析以及平台级联等。 我们在此前的文章中介绍过…

【Python实战】Python采集某大夫文字数据

前言 今天,有一位粉丝找到我,希望我出一期关于某大夫数据采集的文章,今天,我们就来采集某大夫的问诊数据。 环境使用 python 3.9pycharm 模块使用 requests 模块介绍 requests requests是一个很实用的Python HTTP客户端库&…

java 健身营养师网站系统myeclipse定制开发mysql数据库B/S模式java编程计算机网页

一、源码特点 JSP 健身营养师网站系统 是一套完善的系统源码,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。研究的基本内容是基于网上 书店系统,使用JSP作为页面开发工具。Web服…

MMaction2 使用记录1——config介绍

目录 了解config (模型训练测试的整体过程配置文件) 通过脚本参数修改config Config 文件 结构 config文件的命名规则 动作识别的config系统 了解config (模型训练测试的整体过程配置文件) 我们使用python文件作为config&a…

FreeRTOS学习笔记—任务挂起和恢复

文章目录 一、任务挂起和恢复API函数1.1 vTaskSuspend()函数1.2 vTaskResume()函数1.3 xTaskResumeFromISR()函数 二、任务挂起和恢复2.1 任务1挂起解挂任务22.2 中断中解挂任务1 三、补充内容3.1 FreeRTOS数据类型3.2 中断优先级分组3.3 错误问题 一、任务挂起和恢复API函数 …

ChatGPT | Word文档如何更好地提取表格内容给ChatGPT

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! Word文档如何更好地提取表格内容给ChatGPT做知识库,这属于文本预处理工作。 本文只讲思路、测试结果,技术实现用Python和Java都能完成,下一篇文章再贴源码…

Python实用工具--全python制作一个音乐下载器

前言 又来展示一下关于Python的实用小技巧了,这次就来分享分享–如何用Python来制作一个音乐下载器 做这个有什么用啊,我只能说,可以免费下载歌曲啊,这样就能每月保住自己钱包咯 效果展示 基本界面 图片以及文字都是可以自己更…