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 核心作用:在事件循环中添加多个并发任务;
注意:Python 3.7 以后的版本支持 asyncio.create_task(),在此之前的写法为 loop.create_task(),开发过程中需要注意代码写法对不同版本 python 的兼容性。
- 需要指出的是,协程封装为 Task 后不会立马启动,当某个代码 await 这个 Task 的时候才会被执行。
- 一般在开发中,常用的写法是这样的:
-- 然后用 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封装协程的知识点总结的文章就介绍到这了,更多相关python中Task封装协程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理