zoukankan      html  css  js  c++  java
  • 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:如果没有任何结果的任何,程序会一直运行

    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对象赋值。一般不会手动去设置这个。仅了解。

    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

  • 相关阅读:
    为什么lambda中用到的局部变量需要为final
    ubuntu安装idea之后字体不友好
    mysql存表情出错的解决方案(类似xF0x9Fx98x86xF0x9F)
    CentOS7.4 安装mysql
    mysql修改时区
    发个自己写的微信小游戏
    算法:IP分割问题(python实现)
    教你用Python抓取百度翻译
    教你用Python遍历指定目录下的所有文件以及文件的过滤
    教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)
  • 原文地址:https://www.cnblogs.com/minseo/p/15440234.html
Copyright © 2011-2022 走看看