千家信息网

python中Task封装协程的方法

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇文章主要介绍了python中Task封装协程的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中Task封装协程的方法文章都会有所收获,下面我们一起来看
千家信息网最后更新 2024年09月22日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安全错误 数据库的锁怎样保障安全 华为欧拉软件开发 上市企业网络安全检查 珠海校史馆分布式服务器 电力企业是网络安全责任主企业 与政府签订软件开发协议范本 提高公司网络安全 以身犯险的网络安全事件 学校网络安全隐患排查存在的问题 服务器怎么远程传送 速达5000数据库迁移 上饶个人服务器较好的公司 派出所网络安全年度工作计划 实验小学网络安全宣传 千锋教育网络安全课程 网络安全职业道德的职业守则 天堂w北美适合玩哪里的服务器 财务如何做好安全和服务器 服务器pe 硬盘 电商小程序软件开发价钱 贵州软件开发外包业务 安全生产监管对象数据库 计算机网络安全措施包括什么 服务器出现漏洞 局主要领导网络安全 dos中创建数据库流程 软件开发项目简化合同 推荐的企业系统软件开发 福州百业众信网络技术 网络安全如何定级是自己定 网络安全职业道德的职业守则
0