python中的async和await用法

文章目录

  • 任务处理方式
  • 异步操作的优缺点
  • async和awiat
    • async
    • await
    • 使用 async/await 的注意事项
    • 示例

前言:此篇文章是在文心一言的辅助下完成的。

任务处理方式

  • 同步操作:同步操作是指所有的操作都完成后,才返回给用户结果。当一个任务发出请求并等待响应时,如果未收到响应,该任务就会被阻塞,并一直等待直到收到响应为止。例如,在一个同步过程中,如果有一个函数需要较长时间才能返回结果,那么主线程将一直等待该函数的返回,期间无法执行其他任务。
  • 异步操作:异步操作是指两个或多个任务相互独立地执行,其中一个任务不需要等待另一个任务的完成就能开始执行自己的操作。即使某个任务需要等待其他任务的结果,它也不会被阻塞,而是可以继续执行后续的操作。例如,在异步编程中,即使有一个函数需要较长时间才能返回结果,主线程也可以继续执行后面的语句,当该函数返回结果后,通常会通过回调函数的方式通知主线程,并在回调函数中处理该任务的结果。

异步操作的优缺点

异步操作指的是每个终端在消息传输中使用独立的时钟源。具体来说,异步操作中的每一个任务都有一个或多个回调函数(callback)。当一个任务结束后,不是立即执行下一个任务,而是执行相应的回调函数。同时,下一个任务会在前一个任务还在等待回调函数执行时就开始执行。因此,程序的执行顺序与任务的排列顺序是不一致的。

异步操作的优点主要有以下几点:

  1. 无需额外的线程负担:异步操作无需创建新的线程来处理任务,而是使用回调的方式进行处理,这降低了系统的开销。
  2. 减少死锁的可能性:在设计良好的情况下,异步操作的处理函数可以不必使用共享变量,或者至少可以减少共享变量的数量,从而降低了发生死锁的可能性。
  3. 提高程序响应性:异步操作允许在等待某些任务(如I/O操作)完成时,继续执行其他任务,从而提高了程序的响应性和效率。
  4. 适用于I/O密集型应用程序:由于异步操作在处理I/O操作时具有优势,因此它特别适用于这类应用程序。

然而,异步操作也存在一些缺点:

  1. 编程复杂度较高:编写异步操作的程序复杂度相对较高,主要因为需要使用回调方式进行处理,这与普通人的思维方式有所出入。
  2. 难以调试:由于异步操作的非顺序性和回调机制,调试过程可能会变得相对困难。
  3. 错误处理复杂:在异步编程中,错误处理可能变得更为复杂,因为错误可能发生在回调函数中,需要特别注意错误传播的路径。

async和awiat

在 Python 中,asyncawait 是用于处理异步编程的关键字,它们一起工作,使得编写异步代码更加直观和简单。异步编程是一种编程模型,它允许程序在等待某些操作(如 I/O 操作)完成时,继续执行其他任务,从而提高程序的响应性和效率。

async

async 关键字用于定义异步函数。异步函数使用 async def 语法,而不是普通的 def 语法。异步函数内部通常包含 await 表达式,用于等待异步操作完成。

示例:

async def my_async_function():print("Start of my_async_function")await some_other_async_function()print("End of my_async_function")

在这个例子中,my_async_function 是一个异步函数。它首先打印一条消息,然后等待 some_other_async_function 完成(假设这也是一个异步函数),最后打印另一条消息。

await

await 关键字用于在异步函数中等待异步操作完成。它只能用在异步函数内部。当 Python 遇到 await 表达式时,它会暂停当前函数的执行,直到等待的异步操作完成。

示例:

import asyncioasync def my_async_function():print("Start of my_async_function")await asyncio.sleep(1)  # 等待 1 秒print("End of my_async_function")# 获取事件循环
loop = asyncio.get_event_loop()
# 运行异步函数
loop.run_until_complete(my_async_function())

在这个例子中,my_async_function 使用了 await 来等待 asyncio.sleep(1) 完成。这会导致函数暂停执行 1 秒,然后继续执行。

使用 async/await 的注意事项

  1. 只能在异步函数中使用 await:你不能在普通函数中使用 await
  2. 异步函数通常使用 await 调用其他异步函数:这是异步编程模型的核心部分,它允许程序在等待异步操作完成时继续执行其他任务。
  3. 异步函数通常使用 asyncio 库进行事件循环和调度asyncio 是 Python 的标准异步 I/O 库,它提供了用于异步编程的各种工具和功能。
  4. 注意异常处理:异步函数中可能会抛出异常,你需要使用 try/except 块来捕获和处理这些异常。

示例

首先,我们需要一个异步函数来模拟获取网页内容的过程。

import asyncio
import aiohttpasync def fetch_page(session, url):async with session.get(url) as response:return await response.text()

然后,我们可以创建一个异步函数来并发地获取多个网页的内容。这个函数使用了asyncio.gather来并发执行多个异步任务。

async def fetch_multiple_pages(urls):async with aiohttp.ClientSession() as session:tasks = [fetch_page(session, url) for url in urls]return await asyncio.gather(*tasks)

最后,我们可以编写一个主函数来调用这个异步函数,并打印出获取到的网页内容。

async def main():urls = ['https://example.com','https://google.com','https://python.org',]contents = await fetch_multiple_pages(urls)for url, content in zip(urls, contents):print(f"Contents of {url}:\n{content[:100]}...\n")# Python 3.7+
asyncio.run(main())

在这个例子中,fetch_multiple_pages函数会并发地获取多个网页的内容,而不是一个接一个地顺序获取。这大大提高了程序的效率,特别是在网络请求较多的情况下。

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

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

相关文章

每日汇评:黄金等待金叉确认和央行裁决

金价周二早盘徘徊在每盎司2160美元附近,等待主要央行的决定; 尽管美债收益率疲软,但在日本央行和澳央行做出谨慎裁决之前,美元依然坚挺; 随着RSI指数再次转为看涨,黄金价格在日线图上试探金叉形态&#xff…

如何快速下载并剪辑B站视频

1、B站手机端右上角缓存视频; 2、在手机文件管理助手中找到android/data/80找到两个文件,video.m4s和audio.m4s,将它们发送到电脑,系统会默认保存在你的个人文件夹里,C:\users\用户名 3、下载ffmepg https://blog.cs…

算法沉淀——贪心算法二(leetcode真题剖析)

算法沉淀——贪心算法二 01.最长递增子序列02.递增的三元子序列03.最长连续递增序列04.买卖股票的最佳时机 01.最长递增子序列 题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/ 给你一个整数数组 nums ,找到其中最长严格递增子…

蓝桥杯(3.16 刷真题)

P8647 [蓝桥杯 2017 省 AB] 分巧克力 AC import java.util.Scanner;public class Main {static int n,k;static final int N 100010;static int[] a new int[N];static int[] b new int[N];public static boolean check(int x) {int ans 0;for(int i1;i<n;i)ans(a[i]/x…

空间解析几何之直线与平面:推导直线与直线、直线与平面交点

空间解析几何——直线与平面 三维空间中的直线和平面与二维空间中的性质有一定的类似之处&#xff0c;但是其相交关系的求解方式有所差异。本文回顾了三维空间中直线和平面的解析表达&#xff0c;然后推导线-线、线-面交点。 平面 空间平面的表达式为&#xff1a; A x B y…

NCV33172DR2G运算放大器芯片中文资料规格书PDF数据手册引脚图产品概述功能

产品概述&#xff1a; MC33071/72/74 系列单片运算放大器采用了带有创新设计概念的优质双极制造。此类器件根据放大器在 180 A 下运行&#xff0c;提供 1.8 MHz 增益带宽积和 2.1 V/s 摆率&#xff0c;而不采用 JFET 器件技术。尽管此系列可基于分割电源运行&#xff0c;但它尤…

mysql update set时使用and连接使更新的数据出现问题

mysql update set时使用and连接使更新的数据出现问题 简单来讲&#xff0c;我在开发时因为错误的使用and进行set连接而不是用,连接&#xff0c;使数据更新的不对&#xff0c;原本的decimal的数据值0.5被我更新后变成了null而不是0.3 原理在这篇博客里有进行说明&#xff08;我没…

Linux服务器部署若依(ruoyi-vue),从购买服务器到部署完成保姆级教程

零、购买服务器 Huawei Cloud EulerOS 还是 centos7&#xff0c;纠结了一段时间&#xff0c;了解到EulerOS是对centos8的延续版本&#xff0c;相当于官方不对centos8继续维护了&#xff0c; 最后还是选 CentOS 7.9 64bit&#xff0c;网上可查找的工具更多且官方还在持续维护。…

ES: spring boot中使用ElasticsearchClient

一、依赖&#xff1a;&#xff08;要根据不同版本的ES来调整依赖,否则会报错&#xff0c;不支持太低版本的ES&#xff0c;比如7.6以下的&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-e…

PHP反序列化--_wakeup()绕过

一、漏洞原理&#xff1a; 二、靶场复现: 进入靶场&#xff0c;分析源代码&#xff1a; <?php error_reporting(0); class secret{var $fileindex.php;public function __construct($file){$this->file$file;}function __destruct(){include_once($this->file);ech…

算法沉淀——贪心算法三(leetcode真题剖析)

算法沉淀——贪心算法三 01.买卖股票的最佳时机 II02.K 次取反后最大化的数组和03.按身高排序04.优势洗牌 01.买卖股票的最佳时机 II 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/ 给你一个整数数组 prices &#xff0c;其中 pric…

算法第三十天-矩阵中移动的最大次数

矩阵中移动的最大次数 题目要求 解题思路 网格图 DFS 从第一列的任一单元格 ( i , 0 ) (i,0) (i,0) 开始递归。枚举往右上/右/右下三个方向走&#xff0c;如果走一步后&#xff0c;没有出界&#xff0c;且格子值大于 g r i d [ i ] [ j ] grid[i][j] grid[i][j]&#xff0c;则…

未来十年 人工智能的发展前景是什么?

所谓AIGC就是用人工智能来进行内容生产,它的特点就是有非常强大的内容生产力,可以大幅提升内容生产的质量和效率,未来也会极大地丰富大家的数字生活。 是不是感觉现在说数字生活还是很虚,但仔细想想一切都是有迹可循——从Stable Diffusion ChatGPT,再到Midjour-ney V5和…

面向未来的电子元器件批发商城:智能化服务与用户体验革新

面向未来的电子元器件批发商城必须不断地进行智能化服务与用户体验的革新&#xff0c;以适应快速发展的科技趋势和不断变化的市场需求。以下是一些关键的方向和策略&#xff1a; 智能化供应链管理&#xff1a; 引入先进的人工智能和大数据分析技术&#xff0c;实现供应链的智能…

Springboot-软件授权License

无意中看到了一个简单方便的授权方式&#xff0c;只需几步就可集成到boot项目中。 先上地址&#xff1a;smart-license: 保护个人与企业的软件作品权益&#xff0c;降低盗版造成的损失。PS&#xff1a;因个人精力有限&#xff0c;不再提供该项目的咨询答疑服务。 Smart-licen…

Java代码审计安全篇-反序列化漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

QT5.14.2深入解析Qt QProcess用法之彻底掌控进程操作技巧

通过今天的文章&#xff0c;我将带领大家彻底理解和掌握Qt QProcess的使用技巧&#xff0c;这将成为你控制进程的利器。我们的讨论将通过明确的示例&#xff0c;详细的代码案例&#xff0c;结合我在实际软件开发经验中遇到的问题进行说明。 1、Qt QProcess - 什么是进程? 在理…

计算机基础入门2:GPU

GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理器&#xff09;又被称作显示核心、视觉处理器、显示芯片&#xff0c;是一种专为并行处理而设计的微型处理器&#xff0c;非常擅长处理大量简单任务&#xff0c;包括图形和视频渲染。 GPU根据接入系统方式分为集成…

密码学——数字签名

数字签名 引言数字签名签名方案直接数字签名EIGamal 数字签名方案公钥和私钥对的产生签名的产生签名的验证Schnorr 数字签名方案公钥和私钥生成签名生成签名验证证书和认证中心引言 消息认证可以保护双方不受第三方的攻击,但是消息认证不能处理双方自身发生的攻击。如接受方可…

深度学习_卷积

卷积 卷积&#xff08;Convolution&#xff09;是数学和计算机科学中的一个重要概念&#xff0c;特别在信号处理和图像处理中应用广泛。在信号处理领域&#xff0c;卷积是两个函数之间的一种数学操作&#xff0c;它表示两个函数的重叠部分的积分量。 在图像处理中&#xff0c…