协程是一种轻量级的线程,它们允许程序在单个线程内实现并发执行。协程的优势在于它们的调度是非抢占式的,这意味着协程在执行过程中可以主动让出控制权,从而避免了线程上下文切换的开销。协程特别适用于I/O密集型任务,如网络请求和文件读写。
Python中的asyncio
库提供了对协程的支持。以下是一个简单的示例:
import asyncio
async def say_after(delay, what):
print(f"开始等待 {delay} 秒...")
await asyncio.sleep(delay)
print(what)
async def main():
task1 = asyncio.create_task(say_after(1, '1秒已过'))
task2 = asyncio.create_task(say_after(2, '2秒已过'))
await task1
await task2
# Python 3.7 及以上版本可以使用 asyncio.run()
asyncio.run(main())
async def
关键字定义协程函数。await
关键字来挂起协程的执行,直到等待的操作完成。asyncio.create_task()
来创建并调度协程任务。asyncio.run()
来运行主协程函数。问题:协程执行顺序不符合预期。
原因:可能是由于协程调度的时间片分配不均,或者某些协程执行时间过长。
解决方法:
asyncio.sleep()
来模拟I/O操作,让出控制权。asyncio.gather()
来等待多个协程完成。import asyncio
async def say_after(delay, what):
print(f"开始等待 {delay} 秒...")
await asyncio.sleep(delay)
print(what)
async def main():
await asyncio.gather(say_after(1, '1秒已过'), say_after(2, '2秒已过'))
asyncio.run(main())
通过这种方式,可以确保两个协程几乎同时开始执行,并且它们的输出顺序不会因为执行时间的差异而混乱。
协程是一种高效的并发编程模型,特别适合处理I/O密集型任务。通过合理使用asyncio
库,可以轻松构建和管理协程,从而提高程序的性能和响应能力。
领取专属 10元无门槛券
手把手带您无忧上云