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函数会并发地获取多个网页的内容,而不是一个接一个地顺序获取。这大大提高了程序的效率,特别是在网络请求较多的情况下。

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: `async` 和 `await` 是 Python 用于异步编程的关键字。 - `async` 用于定义异步函数,表示该函数是一个异步函数,可以在不阻塞主程序的情况下执行。 - `await` 用于等待异步函数执行完毕,并返回该函数的结果。 举个例子: ``` import asyncio async def fetch_url(url): # 模拟网络请求 await asyncio.sleep(1) return "Data from " + url async def main(): result1 = await fetch_url("https://www.example.com/1") result2 = await fetch_url("https://www.example.com/2") print(result1) print(result2) asyncio.run(main()) ``` 这样,在两个网络请求的执行期间,主程序不会被阻塞,从而保证程序的流畅性。 ### 回答2: Pythonasync/await是用于异步编程的一组关键字,它们可以让我们编写异步程序更加方便、简洁。async/await可以帮助我们处理异步操作的结果,使得我们编写代码时更加清晰,不需要复杂的回调机制和线程池等。 async/await一般都是一起使用的,async表示函数是异步函数,await则表示求值一个异步函数表达式并且等待它执行完成。异步函数是可以暂停并挂起正在执行的代码,从而不影响主要的线程。 在Pythonasyncioasync等同于Coroutine对象,表示一个协程对象,可以被调度程序调度并执行,是异步编程的核心。而await用于等待协程执行完毕,并返回结果。常用的异步库,像aiohttp的请求和响应也是协程对象,并且返回的也是异步的结果。 下面是一个简单的例子: ``` import asyncio async def main(): print('开始执行') await asyncio.sleep(1) print('执行完成') loop = asyncio.get_event_loop() result = loop.run_until_complete(main()) ``` 在这个例子,我们定义了一个异步函数main,调用它时用了await表示等待异步操作完成,结果会被赋值给result。当我们运行这段代码时,会输出以下内容: ``` 开始执行 执行完成 ``` 可以看到,程序在遇到await时暂停了1秒钟,等到异步操作完成后才继续执行下面的代码。 总的来说,async/awaitPython实现异步编程的一种方式,避免了多线程的锁和竞争问题,提高了程序的性能,能够有效提高程序的性能和并发处理能力。 ### 回答3: async和awaitPython 3.5版本后新增的关键字,它们是用来支持异步编程的。异步编程是一种通过异步的方式实现高效操作资源的技术,与传统的同步方式相比,它可以充分利用计算机多核处理能力,提高代码执行效率。 async定义一个coroutine(协程),该函数会立即返回,而不会等待该函数执行完毕。await是用来等待一个coroutine执行完成,调用await函数会暂停当前coroutine的执行,直到await的coroutine执行完毕。 async和await可以用来定义异步函数和异步上下文管理器。下面是一个简单的例子: async def async_function(): await some_coroutine() # do something async with async_context_manager(): await some_coroutine() # do something 在上面的代码async_function是一个异步函数,some_coroutine是另一个coroutine,如果该coroutine执行时间较长,则async_function会在等待该coroutine的执行过程立即返回。async_context_manager是一个异步上下文管理器,也可以在其使用await等待异步操作完成。 需要注意的是,异步编程需要使用异步框架支持(如asyncio),同时需要了解协程和事件循环的工作原理。虽然异步编程有着很高的效率和性能,但是代码的可读性和维护性较差,需要慎重使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

马鹤宁

谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值