python中的async和await用法

这篇具有很好参考价值的文章主要介绍了python中的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 asyncio

async 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 aiohttp

async 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函数会并发地获取多个网页的内容,而不是一个接一个地顺序获取。这大大提高了程序的效率,特别是在网络请求较多的情况下。文章来源地址https://www.toymoban.com/news/detail-859946.html

到了这里,关于python中的async和await用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Swift 中的 async/await ——代码实例详解

    async-await 是在 WWDC 2021 期间的 Swift 5.5 中的结构化并发变化的一部分。Swift 中的并发性意味着允许多段代码同时运行。这是一个非常简化的描述,但它应该让你知道 Swift 中的并发性对你的应用程序的性能是多么重要。有了新的 async 方法和 await 语句,我们可以定义方法来进行异

    2023年04月12日
    浏览(33)
  • Unity 中的 async/await:优雅处理异步任务与协程

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity 中的 async/await:优雅处理异步任务与协程Coroutine       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 async/await 异步等待 为初

    2024年02月06日
    浏览(42)
  • async和await用法理解和快速上手 , 同步任务和异步任务顺序安排和轻松理解 , js代码执行顺序表面知道

    学习关键语句 : async , await 用法 await 怎么使用 同步任务和异步任务 微任务和宏任务 js中代码执行顺序 虽然说 async 和 await 是 Promise 的语法糖 , 但是用惯了Promise 的人(我) , 还真不能超快速使用上这个语法糖 , 所以赶紧写一篇文章出来让各位了解了解这个到底怎么用在我的项目

    2024年02月03日
    浏览(36)
  • Unity中的异步编程【5】——在Unity中使用 C#原生的异步(Task,await,async) - System.Threading.Tasks

    1、System.Threading.Tasks中的Task是.Net原生的异步和多线程包。 2、UniTask(Cysharp.Threading.Tasks)是仿照.Net原生的Task,await,async开发的一个包,该包专门服务于Unity,所以取名UnityTask,简称UniTask。 3、既然有Task了,为啥还要搞一个UniTask (1)Task可以用在PC和Android上,但是在WebGL上则会

    2023年04月17日
    浏览(38)
  • async和await

    Node.JS官方文档:https://nodejs.dev/en/ 创建异步函数,并返回相关数值: 一般方式创建 通过async方式创建: 在async声明的函数中可以使用await来调用异步函数 当我们通过await去调用异步函数时候,它会暂停代码的运行 直到异步代码执行有结果时,才会将结果返回 注意 awa

    2024年02月02日
    浏览(28)
  • async/await 编程理解

    博客参考 Asynchronous Programming in Rust ,并结合其中的例子阐述 async 和 await 的用法,如何使用 async 和 await 是本节的重点。 async 和 await 主要用来写异步代码,async 声明的代码块实现了 Future 特性。如果实现 Future 的代码发生阻塞,会让出当前线程的控制权,允许线程去执行别的

    2024年02月12日
    浏览(32)
  • Promise、Async/Await 详解

            Promise是抽象异步处理对象以及对其进行各种操作的组件。Promise本身是同步的立即执行函数解决异步回调的问题, 当调用 resolve 或 reject 回调函数进行处理的时候, 是异步操作, 会先执行.then/catch等,当主栈完成后,才会去调用执行resolve/reject中存放的方法。      

    2024年02月14日
    浏览(30)
  • Async In C#5.0(async/await)学习笔记

    此文为Async in C#5.0学习笔记 方式一:基于事件的异步Event-based Asynchronous Pattern (EAP). 方式二:基于IAsyncResult接口的异步 方式三:回调 方式四:使用Task,尤其是TaskT 共同的缺陷:必须将方法分为两部分 乱如麻的递归 async/await 注意,下面这样操作可能会有隐患,当firstTask有异常时

    2024年01月22日
    浏览(37)
  • kotlin协程async与await

    kotlin协程async与await 输出: 3 3072 https://zhangphil.blog.csdn.net/article/details/129265638 https://zhangphil.blog.csdn.net/article/details/129265638 kotlin协程、线程切换,函数方法委托_zhangphil的博客-CSDN博客 runBlocking 内部启动的3个协程做耗时操作,从输出可以看到3个协程交叉并发执行,runBlocking 会等

    2024年02月05日
    浏览(30)
  • 【C#】async和await 续

    在文章《async和await》中,我们观察到了一下客观的规律,但是没有讲到本质,而且还遗留了一个问题: 这篇文章中,我们继续看看这个问题如何解决! 我们再看看之前写的代码: 当时问题是,为啥 Task.Factory.StartNew 可以看到异步效果,而Task.Run中却是同步效果。 那其实是因为

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包