python异步编程案例之Future和Task

Python asyncio 的 Future Task Python 中, asyncio 是一个强大的异步编程库,用于编写并发性高的异步程序。在 asyncio 中, Future Task 是两个核心概念,用于管理异步操作的状态执行。本文将详细介绍 asyncio 中的 Future Task ,包括其概念、用法以及实际应用场景,并提供丰富的示例代码。 阅读详情

Future,是对协程的封装,代表一个异步操作的最终结果,其值会在将来被计算出来。当一个Future对象被await的时候,表示当前的协程会持续等待,直到 Future对象所指向的异步操作执行完毕。日常开发基本不需要直接用这个底层 Future 类。可以对Future 实例添加完成后的回调 (add_done_callback)、取消任务 (cancel)、设置最终结果 (set_result)、设置异常 (如果有的话,set_exception) 等。

Task(Task是Future子类)是跟事件循环交互的一种主要方式。创建Task意思就是把coroutine封装成Task实例,并追踪 coroutine 的完成状态。也就是说保存了协程运行后的状态,用于未来获取协程的结果。Task是Future 的子类,因此这个Task实例可以作为变量传给其他代码。也就是说其他代码可以直接await这个Task实例,并且不需要知道原始的coroutine是如何被创建的,并且在 Task实例完成时还可以获取coroutine的返回值。
Task完成有三种情况:
封装的协程已返回
封装的协程已抛出异常
Task被取消

两种创建Task实例的方式,asyncio.ensure_future 和 loop.create_task(python 3.7以后的版本支持asyncio.create_task)。

对于绝大多数场景要并发执行的是协程,所以直接用asyncio.create_task就足够了。注意:如果当前线程中没有正在运行的事件循环,asyncio.create_task将会引发RuntimeError异常。

asyncio.ensure_future,确保返回是一个 Future 对象。除了接受协程,还可以是 Future 对象或者 awaitable 对象。

  1. 如果参数是协程,其实底层还是用的 loop.create_task,返回 Task 对象
  2. 如果是 Future 对象会直接返回
  3. 如果是一个 awaitable 对象会 await 这个对象的__await__方法,再执行一次 ensure_future,最后返回 Task 或者 Future

Future有四种状态:Pending, Running, Done, Cancelled
创建Task实例后,Task实例在加入事件循环之前是pending状态。事件循环调用执行的时候当然就是running,调用完毕自然就是done,如果需要停止事件循环,就需要先把task取消。
注意:coroutine封装为Task后不会立马启动,当某个代码await这个task的时候才会被执行
什么样的对象是awaitable 的呢?类里包含了一个__await__方法。主要有三类awaitable对象:协程coroutine,任务Task,未来对象Future。
为何await 后 Future 的状态就能改变?因为用loop.run_in_executor创建的 Future 注册了一个回调(通过asyncio.futures.wrap_future,加了一个_call_set_state回调。

那为什么要存在 Future 和 Task 这 2 种类型呢? 开发者通常并不需要直接操作 Future 这种底层对象,而是用 Future 的子类 Task 协同的调度协程以实现并发。

import time
import asyncio
now = lambda : time.perf_counter()
async def do_some_work(x):
    print("Hello:",x)
    return "work is done for {}".format(x)
async def main():
    tasks = []
    for i in range(5):
        coroutine = do_some_work(2)
        # task = asyncio.ensure_future(coroutine)
        task = loop.create_task(coroutine)
        tasks.append(task)
    # dones, pendings = await asyncio.wait(tasks)
    # for task in dones:
    #     print("task result:", task.result())
    results = await asyncio.gather(*tasks)
    for result in results:
        print("Task result:",result)
start = now()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main()) # 将协程注册到事件循环,并启动事件循环
loop.close()   
end = now()
print("total run time:", end-start)
python】async异步编程 async异步编程 阅读详情

相关推荐

Python 异步编程核心原理与实践深度解析

协程本质:基于生成器的暂停-恢复机制,async/await 提供清晰语义事件循环:调度核心,基于操作系统 I/O 多路复用实现高效并发:Future 代表异步结果,Task 包装协程并提供控制接口并发模式:gather 适合批量执行,wait 适合精细控制,create_task 适合后台任务异步扩展:异步生成器、异步上下文管理器扩展了异步的能力边界关键原则:避免阻塞、正确关闭资源、控制并发数、处理取消超时。

我的博客 559

Python asyncio 中的 Future Task

这篇文章假设你已经看过了前两篇文章, 理解了什么是协程, 也理解了async defawait的用法.这篇之后的几篇文章会介绍 Python 的协程库 asyncio.asyncio 是 Python 3.4 引入的标准库, 它提供了一些 API, 用于编写异步代码, 例如异步 I/O, 异步网络等. asyncio 也提供了一些工具, 用于编写并发代码, 例如协程, 任务, 事件循环等.

Trb601012的博客 1836

探索 Python Asyncio 的核心:事件循环、TaskFuture 与 Coroutine

本文深入解析 Python asyncio 异步编程框架的核心组件。首先介绍了事件循环(Event Loop)的工作机制,它是asyncio的调度中心,负责管理任务执行流程。其次详细讲解了TaskFutureTask作为协程的封装容器参与事件循环调度,Future则用于表示异步操作的结果。文章还阐述了协程(Coroutine)的基础作用,以及三者的层级关系:协程定义逻辑→Task包装调度→Future表示结果。最后通过高并发爬虫案例展示了asyncio的实际应用价值,并探讨了异步编程的优化方向。

铭渊老黄 6480

Python异步编程Future对象详解

今天继续给大家介绍Python相关知识,本文主要内容是Python异步编程Future对象详解。 一、Python Future对象简介 二、Python Future对象使用示例

永远是少年 3444

【转载】python coroutine,future/task的理解

Event Loop On any platform, when we want to do something asynchronously, it usually involves an event loop. An event loop is a loop that can register tasks to be executed, execute them, delay or even ...

_B a OG 的博客 533

Python_爬虫——协程中taskfuture区别——六月二十三

总结:Task是对协程的封装,用于调度执行协程任务;Future是一个未来对象,用于接收处理异步操作的结果。在实际使用中,Task更常见,它提供了更多的功能便利性,但在某些情况下,使用Future可以更灵活地处理异步操作的结果。在协程中,TaskFuture是两个重要的概念,它们用于管理跟踪异步操作的状态结果。通过创建Task对象,我们可以在事件循环中调度执行协程任务。创建了一个Future对象,然后在协程中设置了Future的结果,最后通过。函数是一个协程,它会返回一个结果。

qq_59344127的博客 620

python3.6 websocket异步高并发_python3.6异步IO包asyncio部分核心源码思路梳理

关于python异步编程的演进过程,两篇文章阐述得妥妥当当,明明白白。中文资料:https://mp.weixin.qq.com/s?__biz=MzIxMjY5NTE0MA==&mid=2247483720&idx=1&sn=f016c06ddd17765fd50b705fed64429c英文资料:http://aosabook.org/en/500L/a-web-cra...

weixin_39685459的博客 506

python异步编程(基于asyncio)

异步编程允许程序在等待某些操作(如I/O操作、网络请求或定时器)完成时不阻塞(即不停止)主线程的执行,从而提高程序的效率响应速度。在异步编程中,程序可以启动一个长时间运行的任务,然后继续执行其他任务,而无需等待该任务完成事件循环,可以把他当做是一个while循环,这个while循环在周期性的运行并执行一些任务,在特定条件下终止循环。其实也可以理解为就是创建一个死循环,比如while循环;

m0_56059292的博客 1万+

Python异步编程避坑指南(ensure_future使用误区大曝光)

掌握Python异步编程关键技巧,深入解析Python 3.5 asyncio.ensure_future的正确用法与常见误区,涵盖任务调度、协程并发控制等典型场景。避免阻塞、提升性能,异步开发效率翻倍,值得收藏。

FuncWander的博客 339

Python 异步编程

文章目录高性能异步编程一、 引入背景1、 概述2、 分析处理二、 终极处理方案三、 异步协程1、 协程2、 用法3、 实现协程3.1 greenlet3.2 yield3.3 asyncio3.4 async & await4、 协程的意义5、 异步编程5.1 事件循环5.2 快速上手5.3 await5.4 Task 对象5.5 Future 对象5.5.1 asyncio.Future 对象5.5.2 concurrent.future.Future 对象5.5.3 案例5.6 异步迭代器5

一个专注于机器学习基础与实战的技术博客,内容涵盖算法推导、模型实现、数学原理与代码实践。用通俗的语言解析复杂概念,记录学习过程中的思考与总结,适合机器学习爱好者和从业者参考。 6005

asyncio.Future() 详细教程:异步编程中的“未来结果”容器

Python异步编程中的​​底层核心工具​​,用于表示异步操作的结果。它通过设置结果,通过await等待完成,为回调机制与语法提供了桥梁。在实际开发中,TaskFuture的子类,更适合运行协程,因此优先使用Task。掌握Future的核心特性,能帮助你更深入理解异步编程的机制,解决复杂的异步流程控制问题。

Rysxt_的博客 751

Python异步编程【asyncio】【异步编程】【协程】

协程 异步 asyncio

lxin690的博客 955

Python爬虫:协程 & 异步编程(asyncio)

文章目录协程 & 异步编程(asyncio)1. 协程的实现1.1 greenlet1.2 yield1.3 asyncio1.4 async & awit1.5 小结2.协程的意义2.1 爬虫案例2.2 小结3.异步编程3.1 事件循环3.2 协程异步编程3.2.1 基本应用3.2.2 await3.2.3 Task对象3.2.4 asyncio.Future对象3.2.5 futures.Future对象3.2.6 异步迭代器3.2.6 异步上下文管理器3.3 小结4. uvloop5

qq_47805483的博客 2037

Python异步编程基石:深入理解asyncio核心原理与实战

事件循环机制:理解了asyncio的单线程并发模型任务调度原理协程本质:掌握了async/await语法背后的协程暂停恢复机制FutureTask:区分了底层结果容器协程包装器的不同用途性能优化:学会了并发控制、错误处理、性能监控等高级技巧实战应用:通过真实案例掌握了异步编程在企业级项目中的应用根据实际测试项目经验,异步编程在不同场景下的性能表现:场景类型同步版本耗时异步版本耗时性能提升适用性评级I/O密集型任务100%20-30%3-5倍⭐⭐⭐⭐⭐网络请求批量处理。

七夜zippoe的博客 2780

Python异步编程十大最佳实践(附真实项目案例):让你的代码效率飙升

掌握Python异步编程核心技巧,提升程序性能与响应速度。本文深入讲解python异步编程 async await 详解,涵盖网络请求、文件IO等高并发场景的最佳实践,结合真实项目案例解析。高效利用资源,避免阻塞等待,显著提升执行效率,值得收藏。

FastProceed的博客 672

Python异步编程_asyncio

异步编程的主要目的在于:通过一个线程利用其io等待时间达到用更少的资源去做更多的事的目的。

m0_59485658的博客 1065

Python异步编程实战指南【python基础篇】

本文介绍了Python异步编程的核心概念实践方法。主要内容包括:1)同步与异步编程的对比,展示了异步编程在处理I/O密集型任务时的性能优势;2)协程的基本用法,通过async/await语法实现非阻塞执行;3)事件循环的工作原理及其管理方式;4)FutureTask的应用场景。文章还详细解析了asyncio模块的关键功能,如并发执行任务的gather()wait()方法,以及异步上下文管理器的实现。通过多个代码示例,演示了如何利用异步编程提升程序性能,特别适合需要处理高并发I/O操作的场景。

博客 6847

协程 & 异步编程(asyncio)

协程 & 异步编程(asyncio)

weixin_53909748的博客 1141
上一篇: windows/Linux python3 venv/virtualenv/virtualenvwrapper 创建虚拟环境
下一篇: python异步编程案例之事件循环
HighDS
博客等级 码龄7年 13粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值