一、协程概念
协程是一种用户态的轻量级线程,可以进行非抢占式多任务调度的并发编程。一个线程内部可以有多个协程,协程之间可以通过yield关键字进行切换,yield可以将控制权交还给主线程,同时保存协程的状态,以便后续继续执行。协程在Python异步编程中起到了至关重要的作用,能够有效地提升程序的执行效率和并发性。
二、协程的实现
在Python中实现协程可以使用async/await关键字和生成器两种方式:
1、使用async/await关键字
import asyncio async def coroutine(): print("start coroutine") await asyncio.sleep(1) print("end coroutine") async def main(): task = asyncio.create_task(coroutine()) await task if __name__ == "__main__": asyncio.run(main())
使用async/await关键字定义一个协程函数coroutine(),在函数体内使用await关键字进行任务切换,同时使用asyncio.create_task()函数创建一个异步任务,最后在主函数main()中使用async/await关键字await task等待任务执行完成。
2、使用生成器
def coroutine(): print("start coroutine") while True: x = yield print("get value:", x) if __name__ == "__main__": c = coroutine() c.send(None) c.send(1)
使用生成器定义一个协程函数coroutine(),使用yield关键字在协程中进行任务切换,通过send()函数发送数据给协程,同时可以在send()函数中获取协程返回的值。
三、协程的优势
协程可以在单线程内实现多任务调度,避免了线程切换的开销,在I/O密集型的程序中可以有效地提高运行效率。
四、协程的缺点
协程需要手动进行任务切换,如果在协程内部有IO操作比较频繁或者阻塞,会导致协程等待IO操作完成,从而阻塞主程序的运行。