• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python中Task封装协程的知识点总结

    说明

    1、Task是Future的子类,Task是对协程的封装,我们把多个Task放在循环调度列表中,等待调度执行。

    2、Task对象可以跟踪任务和状态。Future(Task是Futrue的子类)为我们提供了异步编程中最终结果的处理(Task类还具有状态处理功能)。

    3、把协程封装成Task,加入一个队列等待调用。刚创建Task的时候不执行,遇到await就执行。

    实例

    import asyncio
     
    async def func():
    print(1)
    await asyncio.sleep(2)
    print(2)
    return "返回值"
     
     
    async def main():
    print("main开始")
     
    # 创建协程,将协程封装到Task对象中并添加到事件循环的任务列表中,等待事件循环去执行(默认是就绪状态)。
    # 在调用
    task_list = [
    asyncio.create_task(func(), name="n1"),
    asyncio.create_task(func(), name="n2")
    ]
     
    print("main结束")
     
    # 当执行某协程遇到IO操作时,会自动化切换执行其他任务。
    # 此处的await是等待所有协程执行完毕,并将所有协程的返回值保存到done
    # 如果设置了timeout值,则意味着此处最多等待的秒,完成的协程返回值写入到done中,未完成则写到pending中。
    done, pending = await asyncio.wait(task_list, timeout=None)
    print(done, pending)
     
     
    asyncio.run(main())

    知识点扩展:

    Task 概念及用法

    创建 Task,意思就是把协程封装成 Task 实例,并追踪协程的 运行 / 完成状态,用于未来获取协程的结果。

    具体来说,是通过 asyncio.create_task() 创建 Task,让协程对象加入时事件循环中,等待被调度执行。

    注意:Python 3.7 以后的版本支持 asyncio.create_task(),在此之前的写法为 loop.create_task(),开发过程中需要注意代码写法对不同版本 python 的兼容性。

    当多个 Task 被加入一个 task_list 的时候,添加 Task 的过程中 Task 不会执行,必须要用 await asyncio.wait() 或 await asyncio.gather() 将 Task 对象加入事件循环中异步执行。

    -- 先创建 task_list 空列表;
    -- 然后用 asyncio.create_task() 创建 Task;
    -- 再把 Task 对象加入 task_list;
    -- 最后使用 await asyncio.wait 或 await asyncio.gather 将 Task 对象加入事件循环中异步执行。

    注意:创建 Task 对象时,除了可以使用 asyncio.create_task() 之外,还可以用最低层级的 loop.create_task() 或 asyncio.ensure_future(),他们都可以用来创建 Task 对象,其中关于 ensure_future 相关内容本文接下来会一起讲。

    Task 用法代码示例:

    import asyncio
    import arrow
    
    
    def current_time():
        '''
        获取当前时间
        :return:
        '''
        cur_time = arrow.now().to('Asia/Shanghai').format('YYYY-MM-DD HH:mm:ss')
        return cur_time
    
    
    async def func(sleep_time):
        func_name_suffix = sleep_time        # 使用 sleep_time(函数 I/O 等待时长)作为函数名后缀,以区分任务对象
        print(f"[{current_time()}] 执行异步函数 {func.__name__}-{func_name_suffix}")
        await asyncio.sleep(sleep_time)
        print(f"[{current_time()}] 函数 {func.__name__}-{func_name_suffix} 执行完毕")
        return f"【[{current_time()}] 得到函数 {func.__name__}-{func_name_suffix} 执行结果】"
    
    
    async def run():
        task_list = []
        for i in range(5):
            task = asyncio.create_task(async_func(i))
            task_list.append(task)
    
        done, pending = await asyncio.wait(task_list, timeout=None)
        for done_task in done:
            print((f"[{current_time()}] 得到执行结果 {done_task.result()}"))
    
    def main():
        loop = asyncio.get_event_loop()
        loop.run_until_complete(run())
    
    
    if __name__ == '__main__':
        main()

    到此这篇关于python中Task封装协程的知识点总结的文章就介绍到这了,更多相关python中Task封装协程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Python自动化测试PO模型封装过程详解
    • Python面向对象封装继承和多态示例讲解
    • Python 调用C++封装的进一步探索交流
    • Python如何实现Paramiko的二次封装
    • 使用Python封装excel操作指南
    • python excel和yaml文件的读取封装
    • python 使用paramiko模块进行封装,远程操作linux主机的示例代码
    • Python之根据输入参数计算结果案例讲解
    上一篇:理解python中装饰器的作用
    下一篇:Python中return用法案例详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python中Task封装协程的知识点总结 python,中,Task,封装,协程,