asyncio模块学习
asyncio模块学习
Python中的异步编程的核心语法就是async/await两个关键字,主要涉及的概念就是协程(coroutine)。关于协程的解释,简单来说,协程就是在一个线程(thread)里通过事件循环(event loop)模拟出多个线程并发的效果。
Python中的协程概念
在Python中,协程coroutine有两层含义:
- 使用async def定义的函数是一个coroutine,这个函数内部可以用await关键字。
- 使用async def定义的函数,调用之后返回的值,是一个coroutine对象,可以被用于await或者asyncio.run等
我们可以看到:
- 第一层含义是语法层面的概念,一个函数(一段代码)由async def定义,那么它就是一个coroutine。带来的效果是,这个函数内部可以用await。那么反过来就是说,一个普通的def定义的函数,内部不能用await,否则就会触发语法错误(SyntaxError)。
- 第二层含义是Python解释器运行时的概念,coroutine是Python解释器里内置的一个类。当我们调用async def定义的函数时,得到的返回值的类型就是coroutine。
create_task()函数创建协程任务
import asyncioasync def my_coroutine():print("Coroutine started")await asyncio.sleep(1)print("Coroutine resumed")async def main():print("Main program started")task = asyncio.create_task(my_coroutine()) # 创建协程任务await taskprint("Main program finished")asyncio.run(main()) # 执行主协程
gather()函数创建并发执行的多个任务
import asyncioasync def task1():print("Task 1 started")await asyncio.sleep(1)print("Task 1 completed")async def task2():print("Task 2 started")await asyncio.sleep(2)print("Task 2 completed")async def main():print("Main program started")await asyncio.gather(task1(), task2()) # 并发执行两个任务print("Main program finished")asyncio.run(main()) # 运行主协程