【协程coroutine】async & await

asyncawait 是 Python 3.5 及以上版本中引入的用于编写异步代码的关键词。它们帮助开发者编写出简洁且高效的异步 IO 操作,比如网络请求、文件读写等,避免阻塞主线程。

以下是asyncawait 的简单介绍和使用示例:

1. async 关键词

async 用于定义协程(coroutine),协程是一种能在执行过程中暂停并在需要时继续执行的函数。带有 async 关键字的函数被称为异步函数或协程函数。

import asyncio

async def my_coroutine():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

# 调用协程函数不会立即执行,需要用`await`或在事件循环中运行

2. await 关键词

await 用于在协程中等待一个异步操作完成。它只能在async定义的函数中使用。

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)  # 模拟异步操作
    print("World")

# 像这样直接运行不会有输出
say_hello()

3. 使用事件循环执行协程

为了执行协程,需要将它们放到事件循环(event loop)中运行。Python 提供了 asyncio.run 方法来简化这个过程。

import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")

# 运行协程函数
asyncio.run(say_hello())

当你运行上述代码时,输出将会是:

Hello
<暂停1秒>
World

4. 常见用法与示例

假设你想并发执行多个异步操作,比如抓取网页内容。可以使用 asyncawait 来达到并发执行的效果。

import asyncio

async def fetch_data(delay, data):
    print(f"Fetching {data} with delay {delay}s")
    await asyncio.sleep(delay)
    print(f"Fetched {data}")

async def main():
    tasks = [
        fetch_data(2, "data1"),
        fetch_data(1, "data2"),
        fetch_data(3, "data3")
    ]
    await asyncio.gather(*tasks)

asyncio.run(main())

在这个例子中,asyncio.gather 用来并发地执行多个协程。协程 fetch_data 会并发执行,而不是顺序执行,大大提高了效率。

总结

  • async 用于定义异步函数。
  • await 在异步函数中等待另一个异步操作完成。
  • 使用 asyncio.run 或 事件循环来调度执行协程。

掌握 asyncawait 能大大提升你在处理 IO 密集型任务,如网络请求和文件操作时的代码效率和结构清晰度。

### Python 协程 Coroutine 使用教程与常见问题 #### 一、协程简介 协程是一种并发编程技术,它允许程序在执行过程中暂停和恢复。协程可以看作一种特殊的函数,能够暂停其执行去运行其他的任务,并能在之后返回到暂停处继续执行。相较于线程或进程而言,协程拥有更低的资源消耗以及更高的执行效率[^4]。 #### 二、使用 asyncawait 定义协程 `async` 和 `await` 是 Python 中用于定义和调用协程的关键字。这两个关键字使得编写异步代码变得更加简洁直观,有助于处理并发任务。下面是一个简单的例子来展示如何创建并启动一个基本的协程: ```python import asyncio async def say_after(delay, what): await asyncio.sleep(delay) print(what) async def main(): task1 = say_after(1, &#39;hello&#39;) task2 = say_after(2, &#39;world&#39;) # Wait until both tasks are completed (should take around 2 seconds.) await task1 await task2 # Run the event loop to execute coroutines. asyncio.run(main()) ``` 这段代码展示了两个延迟打印语句的任务被安排在一个事件循环里依次完成;其中每个任务都会等待指定的时间间隔后再输出相应的内容[^1]。 #### 三、利用 asyncio 编写并发异步代码 `asyncio` 模块提供了丰富的工具支持开发者构建复杂的异步应用程序。除了上述提到的基础功能外,还包含了诸如队列、锁机制等功能组件帮助管理多任务间的协作关系。这里给出一段更加复杂一点的例子说明如何同时发起多个 HTTP 请求而不阻塞主线程的工作流程: ```python import aiohttp import asyncio async def fetch(session, url): async with session.get(url) as response: return await response.text() async def main(urls): async with aiohttp.ClientSession() as session: results = await asyncio.gather(*[fetch(session, url) for url in urls]) for result in results: print(result[:100]) # Print first 100 characters of each page. urls = [&quot;https://example.com&quot;, &quot;https://www.python.org&quot;] asyncio.run(main(urls)) ``` 此段脚本会向给定 URL 列表发送 GET 请求并将接收到的数据部分显示出来。值得注意的是整个过程是在同一个线程内高效地完成了多项I/O操作而无需担心传统同步模式下可能产生的性能瓶颈问题[^2]。 #### 四、Gevent 库介绍及其应用场景 对于那些希望简化开发工作量又不想深入研究底层细节的人来说,`gevent` 可能是个不错的选择。该库基于 `greenlet` 构建而成并通过所谓的&ldquo;猴子补丁&rdquo;实现了透明化控制流转移的效果&mdash;&mdash;即当某个绿色线程处于休眠状态时操作系统将会自动切换至下一个可运行实例上继续推进整体进度直至所有待办事项都被妥善处置完毕为止。特别是在面对大量短时间内的高频率交互请求(比如Web服务器端口监听)或是长时间占用外部资源的操作场合之下往往可以获得较为理想的吞吐率表现[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值