zoukankan      html  css  js  c++  java
  • asyncio: Task, create_task, ensure_future 都可以创建任务,该用哪个?

    文档里明确指出:

    Don’t directly create Task instances: use the ensure_future() function or the BaseEventLoop.create_task() method.

    翻译:不要直接创建 Task 实例,应该使用 ensure_future() 函数或 BaseEventLoop.create_task() 方法。

    为什么呢?看 create_task 的文档:

    Third-party event loops can use their own subclass of Task for interoperability. In this case, the result type is a subclass of Task.

    翻译:为了 interoperability,第三方的事件循环可以使用自己的 Task 子类。这种情况下,返回结果的类型是 Task 的子类。

    那么用 ensure_future 还是 create_task 呢?先对比一下函数声明:

    asyncio.ensure_future(coro_or_future, *, loop=None)
    BaseEventLoop.create_task(coro)

    显然,ensure_future 除了接受 coroutine 作为参数,还接受 future 作为参数。

    看 ensure_future 的代码,会发现 ensure_future 内部在某些条件下会调用 create_task,综上所述:

    encure_future: 最高层的函数,推荐使用!
    create_task: 在确定参数是 coroutine 的情况下可以使用。
    Task: 可能很多时候也可以工作,但真的没有使用的理由!

    #####

    我已经看过几个关于asyncio的基本Python 3.5教程,它们以各种方式执行相同的操作。在这段代码中:

    import asyncio  
    
    async def doit(i):
        print("Start %d" % i)
        await asyncio.sleep(3)
        print("End %d" % i)
        return i
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        #futures = [asyncio.ensure_future(doit(i), loop=loop) for i in range(10)]
        #futures = [loop.create_task(doit(i)) for i in range(10)]
        futures = [doit(i) for i in range(10)]
        result = loop.run_until_complete(asyncio.gather(*futures))
        print(result)

    上面定义futures变量的所有三个变体都实现了相同的结果; 我能看到的唯一区别是,对于第三个变体,执行是乱序的(在大多数情况下这应该无关紧要)。还有其他区别吗?有些情况下我不能只使用最简单的变体(协程的简单列表)吗?

    上面是三种方式实现的协程异步,

    有什么区别?

    从Python 3.7开始,为此目的添加了asyncio.create_task(coro)高级功能。

    您应该使用它来代替从coroutimes创建任务的其他方法。但是,如果您需要从任意等待创建任务,您应该使用asyncio.ensure_future(obj)。

    #####

  • 相关阅读:
    XAMPP重要文件目录及配置
    xmlhttp
    深入php内核,从底层c语言剖析php实现原理
    史上最全的MSSQL复习笔记
    LNMP状态管理命令
    SSL证书更换(具体路径可参考iRedMail.tips文件)及邮件服务器架构
    (转)CentOS 7 —— /etc/rc.local 开机不执行
    从CMDB查询云平台组件或者IP简单脚本
    将电脑文件复制到vm虚拟机中,然后安装步骤
    Linux-vmware tools安装与cdrom挂载(转)
  • 原文地址:https://www.cnblogs.com/andy0816/p/15591485.html
Copyright © 2011-2022 走看看