python异步编程 本质: (1)创建协程后后台执行, 还是(2)创建协程后”等待”执行。两者抽象出了asyncio的语法糖
async def async_func()可以快速定义异步方便
await async_func()会等待函数执行完成才继续下面的函数
实际上await是主动挂起协程, 但还是在事件循环中运行
task = asyncio.create_task(async_func(args))才会真正异步, “后台执行”
后台启动后立刻返回一个handle(task/future/可以等待对象)
res = await task主动等待完成, 或者使用res = task.result()
asyncio.run(main)启动入口函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import asyncioimport timeasync def slow_task (name, delay) : print(f"任务 {name} 开始" ) await asyncio.sleep(delay) print(f"任务 {name} 结束" ) return f"{name} 结果" async def main () : print("=== 用 await 调用 ===" ) t = time.time() result1 = await slow_task("A" , 1 ) print(time.time() - t) print(f"拿到结果: {result1} " ) print("\n=== 用 create_task 后台执行 ===" ) t = time.time() task_b = asyncio.create_task(slow_task("B" , 2 )) task_c = asyncio.create_task(slow_task("C" , 1 )) print(time.time() - t) print("已创建B、C任务,继续执行主线程逻辑..." ) t = time.time() result_b = await task_b result_c = await task_c print(time.time() - t) print(f"最终结果: {result_b} , {result_c} " ) asyncio.run(main()) """ === 用 await 调用 === 任务 A 开始 任务 A 结束 1.0012452602386475 拿到结果: A 结果 === 用 create_task 后台执行 === 4.792213439941406e-05 已创建B、C任务,继续执行主线程逻辑... 任务 B 开始 任务 C 开始 任务 C 结束 任务 B 结束 2.001450300216675 最终结果: B 结果, C 结果 """