Python协程的用法和例子详解
什么是协程
协程(Coroutines)又称微线程,纤程。协程是一种用户态的轻量级线程,协程的调度完全由用户控制,不需要操作系统进行切换,因此可以实现非常高效的并发。
Python 3.4 引入了 asyncio 模块,内置了对异步 IO 的支持。在 asyncio 中,异步操作的主体就是协程。
协程的用法
协程在 Python 中使用生成器实现。在生成器函数中可以使用 yield
关键字来挂起当前的执行,然后等待下次被唤醒时继续执行。
要使用协程来实现异步操作,需要满足两个条件:
- 存在 IO 操作、等待请求响应等耗时操作
- 能够使用
yield
挂起当前协程的执行,等待异步操作完成后唤醒协程继续执行
在 Python 中,可以通过使用 async
和 await
关键字来构建协程对象,实现异步操作。
import asyncio
async def main():
print('hello')
await asyncio.sleep(1)
print('world')
asyncio.run(main())
上述代码中,使用 async
定义了一个协程对象 main
。在协程中使用 await
关键字来挂起当前协程的执行,等待异步操作完成后再继续执行。此处使用 asyncio.sleep()
来模拟协程的异步操作。
实际示例
示例1 - 异步请求
假设要实现一个异步获取网页内容的功能,可以使用协程来实现。
先安装依赖:
pip install aiohttp
import aiohttp
import asyncio
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://www.baidu.com')
print(html[:200])
asyncio.run(main())
上述代码中,使用了 aiohttp 库来进行异步请求,首先定义了一个 fetch
协程函数,用来实现异步请求。在 main
函数中创建了 aiohttp 客户端会话,然后调用了 fetch
方法来异步请求百度首页,并输出前200个字符。
示例2 - 并行异步任务
假设我们需要并行执行多个异步任务,并发执行,等待所有任务完成后输出结果,可以使用 asyncio 库的 gather
方法。
import asyncio
async def coro1():
await asyncio.sleep(1)
return 'coro1'
async def coro2():
await asyncio.sleep(2)
return 'coro2'
async def main():
results = await asyncio.gather(coro1(), coro2())
print(results)
asyncio.run(main())
上述代码中,定义了两个协程 coro1
和 coro2
,分别模拟了两个异步任务。在 main
函数中使用 gather
方法并行执行异步任务,并等待所有任务完成后输出结果。
总结
协程是一种高效的并发编程方式,在 Python 中通过使用生成器及 async
和 await
关键字来实现。协程可以实现异步 IO、CPU 密集型计算等任务,并且能够提高程序的执行效率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python协程的用法和例子详解 - Python技术站