千家信息网

python中Task封装协程的方法

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,这篇文章主要介绍了python中Task封装协程的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中Task封装协程的方法文章都会有所收获,下面我们一起来看
千家信息网最后更新 2025年01月17日python中Task封装协程的方法

这篇文章主要介绍了python中Task封装协程的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇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,是 python 中与事件循环进行交互的一种主要方式。

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

  • Task 核心作用:在事件循环中添加多个并发任务;

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

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

  • 需要指出的是,协程封装为 Task 后不会立马启动,当某个代码 await 这个 Task 的时候才会被执行。

当多个 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 asyncioimport arrowdef current_time():    """    获取当前时间    :return:    """    cur_time = arrow.now().to("Asia/Shanghai").format("YYYY-MM-DD HH:mm:ss")    return cur_timeasync 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封装协程的方法"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

封装 对象 循环 事件 任务 函数 方法 状态 知识 结果 代码 内容 写法 多个 时候 调度 子类 实例 版本 篇文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 阜阳软件开发培训多少钱 上海辅助网络技术价格咨询 信息技术网络安全教育教案 新都区软件开发学习 excel制作数据库并快速查找 怎么用c登录数据库 汽车软件开发v模型 网络安全为人民服务手抄报简画 数据库杀我 ox 服务器 服务器cpu一直100 ccrc软件开发资质公司有哪些 梦幻西游大东海服务器开发时间 北京和图时代网络技术 英雄联盟登录进不去服务器 怎样写路由器的数据库 虚拟机上怎么创建dns服务器 军营网络安全教育图片 在sci数据库中检索关于废水 邬贺铨工业互联网的网络技术 什么服务器可以管理软件 长春有哪些网络技术有限公司 美团应聘软件开发查不查学历 关于信息网络安全的报道 北京市网络安全信息中心 大学生网络安全知识竞赛作弊 为什么坦克世界总是服务器断开 代理服务器保护怎么取消 微信开发者怎么清理数据库 开了黑魂3不能连接服务器
0