Python之future对象
参考:https://www.jianshu.com/p/9643230adadb
协程中更底层的对象:future对象,一般不会直接使用,它是task类的基类,task一部分功能是future提供的,其是更低级的接口,帮助我们去等待异步的结果。例如res=await task1 ,等结果是由future对象来创建的,future对象内部封装了一个_state的值,维护着状态,如果变成finished,就不再等待,而是往后执行
task对象继承future,task对象内部await结果的处理是基于Future对象进行处理的。
示例1:如果没有任何结果的任何,程序会一直运行
1 2 3 4 5 6 7 8 9 10 11 12 | import asyncio async def main(): # 获取当前事件循环 loop = asyncio.get_running_loop() # 创建future对象 fut = loop.create_future() print ( 1 ) # 等待任务最终结果,如果没有结果会一直等待下去 await fut asyncio.run(main()) |
输出如下
分析:执行主协程函数main()以后首先获取当前的事件循环,然后使用该事件循环创建一个future对象,接下来打印1
然后遇到await fut程序等待fut的结果,因为一直没有结果所以阻塞,程序一直运行
示例2:手动给future对象赋值。一般不会手动去设置这个。仅了解。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import asyncio async def set_after(fut): await asyncio.sleep( 1 ) fut.set_result( '888' ) async def main(): # 获取当前事件循环 loop = asyncio.get_running_loop() # 创建future对象,没绑定任何行为,则这个任务不知道什么时候结束 fut = loop.create_future() # 创建一个任务task对象,绑定了set_after函数,函数内部在等待1秒后会给future赋值 # 手动设置了future任务的最终结果,那么fut就结束了 loop.create_task(set_after(fut)) r1 = await fut print (r1) asyncio.run(main()) # 手动给future赋值 end |
运行main()创建事件循环然后使用该事件循环创建一个future,新创建的future是没有任何任务的,接下来创建一个task绑定任务,set_after(fut)把future作为参数传递给函数,函数执行的操作为等待1秒以后给这个future设置一个结束并设置返回的结果。
r1 = await fut是运行future并且把结果赋值给r1,最后打印出r1的值为888
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2017-10-27 Oracle之归档模式与非归档模式