python协程Coroutine
时间: 2025-05-20 11:40:26 浏览: 23
### Python 协程 Coroutine 使用教程与常见问题
#### 一、协程简介
协程是一种并发编程技术,它允许程序在执行过程中暂停和恢复。协程可以看作一种特殊的函数,能够暂停其执行去运行其他的任务,并能在之后返回到暂停处继续执行。相较于线程或进程而言,协程拥有更低的资源消耗以及更高的执行效率[^4]。
#### 二、使用 async 和 await 定义协程
`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, 'hello')
task2 = say_after(2, 'world')
# 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 = ["https://example.com", "https://www.python.org"]
asyncio.run(main(urls))
```
此段脚本会向给定 URL 列表发送 GET 请求并将接收到的数据部分显示出来。值得注意的是整个过程是在同一个线程内高效地完成了多项I/O操作而无需担心传统同步模式下可能产生的性能瓶颈问题[^2]。
#### 四、Gevent 库介绍及其应用场景
对于那些希望简化开发工作量又不想深入研究底层细节的人来说,`gevent` 可能是个不错的选择。该库基于 `greenlet` 构建而成并通过所谓的“猴子补丁”实现了透明化控制流转移的效果——即当某个绿色线程处于休眠状态时操作系统将会自动切换至下一个可运行实例上继续推进整体进度直至所有待办事项都被妥善处置完毕为止。特别是在面对大量短时间内的高频率交互请求(比如Web服务器端口监听)或是长时间占用外部资源的操作场合之下往往可以获得较为理想的吞吐率表现[^3]。
阅读全文
相关推荐

















