游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

在Python中使用Asyncio系统(34)Task和Fu

  Task和Future
  前面我们讨论了协程,以及如何在循环中运行它们才有用。现在我想简单谈谈Task和Futureapi。你将使用最多的是Task,因为你的大部分工作将涉及使用createtask()函数运行协程,就像在第22页的快速开始中设置的那样。Future类实际上是Task的超类,它提供了与循环交互操作的所有功能。
  可以这样简单地理解:Future表示某个活动的未来完成状态,并由循环管理。Task是完全相同的,但是具体的activity是一个协程可能是你用asyncdef函数加上createtask()创建的协程。
  Future类表示与循环交互的某个东西的状态。这个描述太模糊了,不太有用,所以你可以将Future实例视为一个切换器,一个完成状态的切换器。当创建Future实例时,切换设置为尚未完成状态,但稍后它将是完成状态。事实上,Future实例有一个名为done()的方法,它允许你检查状态,如示例315所示。
  示例315。用done()方法检查完成状态fromasyncioimportFuturefFuture()f。done()False
  Future实例还可以执行以下操作:
  设置一个result值(用。setresult(value)设置值并且使用。result()获取值)
  使用。cancel()方法取消(并且会用使用。cancelled()检查是否取消)
  增加一个Future完成时回调的函数
  即使Task更常见,也不可能完全避免使用Future:例如,在执行器上运行函数将返回Future实例,而不是Task。让我们快速看一下示例316,了解一下直接使用Future实例是什么感觉。
  示例316。与Future实例的交互importasyncioasyncdefmain(f:asyncio。Future):。。。awaitasyncio。sleep(1)。。。f。setresult(Ihavefinished。)。。。loopasyncio。geteventloop()futasyncio。Future()print(fut。done())Falseloop。createtask(main(fut))TaskpendingnameTask1coromain()runningatconsole:1loop。rununtilcomplete(fut)Ihavefinished。print(fut。done())Trueprint(fut。result())Ihavefinished。
  (L3)创建一个简单的main函数。我们运行这个函数,等上一会儿然后在Futuref上设置一个结果。
  (L5)设置一个结果。
  (L8)手动创建一个Future实例。注意,这个实例(默认情况下)绑定到我们的循环,但它没有也不会被附加到任何协程(这就是Tasks的作用)。
  (L9)在做任何事情之前,确认future还没有完成。
  (L11)安排main()协程,传递future。请记住,main()协程所做的所有工作就是sleep,然后切换Future实例。(注意main()协程还不会开始运行:协程只在事件循环运行时才开始运行。)
  (L13)在这里我们在Future实例上而不是Task实例上使用rununtilcomplete()。这和你以前见过的不一样。现在循环正在运行,main()协程将开始执行。
  (L16)最终,当future的结果被设置时,它就完成了。完成后,可以访问结果。
  当然,你不太可能以这里所示的方式直接使用Future;代码示例仅用于教育目的。你与asynccio的大部分联系都是通过Task实例进行的。
  你可能想知道如果在Task实例上调用setresult()会发生什么。在Python3。8之前可以这样做,但现在不允许这么做了。任务实例是协程对象的包装器,它们的结果值只能在内部设置为底层协程函数的结果,如示例317所示那样。
  示例317。在task上调用setresultimportasynciofromcontextlibimportsuppressasyncdefmain(f:asyncio。Future):。。。awaitasyncio。sleep(1)。。。try:。。。f。setresult(Ihavefinished。)。。。exceptRuntimeErrorase:。。。print(fNolongerallowed:{e})。。。f。cancel()。。。loopasyncio。geteventloop()futasyncio。Task(asyncio。sleep(1000000))print(fut。done())Falseloop。createtask(main(fut))TaskpendingnameTask2coromain()runningatconsole:1withsuppress(asyncio。CancelledError):。。。loop。rununtilcomplete(fut)。。。Nolongerallowed:Taskdoesnotsupportsetresultoperationprint(fut。done())Trueprint(fut。cancelled())True
  (L13)唯一的区别是我们创建的是Task实例而不是Future实例。当然,TaskAPI要求我们提供一个协程;这里我们使用sleep()只是因为简单方便。
  (L7)正在传入一个Task实例。它满足函数的类型签名(因为Task是Future的子类),但从Python3。8开始,我们不再允许在Task上调用setresult():尝试这样做将引发RuntimeError。这个想法是,一个Task代表一个正在运行的协程,所以结果应该总是来自于task自身。
  (L10,L24)但是,我们仍然可以cancel()一个任务,它将在底层协程中引发CancelledError。
  Createtask?EnsureFuture?下定决心吧!
  在第22页的快速入门中,我说过运行协程的方法是使用asyncio。createtask()。在引入该函数之前,有必要获取一个循环实例并使用loop。createtask()完成相同的任务。事实上,这也可以通过一个不同的模块级函数来实现:asyncio。ensurefuture()。一些开发人员推荐createtask(),而其他人推荐ensurefuture()。
  在我为这本书做研究的过程中,我确信API方法asyncio。ensurefuture()是引起对asyncio库广泛误解的罪魁祸首。API的大部分内容都非常清晰,但在学习过程中还存在一些严重的障碍,这就是其中之一。当你遇到ensurefuture()时,你的大脑会非常努力地将其集成到关于asyncio应该如何使用的心理模型中但很可能会失败!
  在Python3。6asyncio文档中,这个现在已经臭名昭著的解释突出了ensurefuture()的问题:
  asyncio。ensurefuture(coroorfuture,,loopNone)
  安排执行一个协程对象:把它包装在future中。返回一个Task对象。如果参数是Future,则直接返回。
  什么!?当我第一次读到这篇文章时,我很困惑。下面希望是对ensurefuture()的更清楚的描述:如果你传入一个协程,它将生成一个Task实例(你的协程将被调度在事件循环上运行)。这与调用asyncio。createtask()(或loop。createtask())并返回新的Task实例是相同的。如果你传入一个Future实例(或者一个Task实例,因为Task是Future的子类),你会得到相同的东西返回,没有改变。是的,真的!
  这个函数很好地说明了针对终端用户开发人员的asyncioAPI(高级API)和针对框架设计人员的asyncioAPI(低级API)之间的区别。让我们在示例318中自习看看它是如何工作的。
  示例318。仔细看看ensurefuture()在做什么importasyncioasyncdeff():passcorof()loopasyncio。geteventloop()taskloop。createtask(coro)assertisinstance(task,asyncio。Task)newtaskasyncio。ensurefuture(coro)assertisinstance(newtask,asyncio。Task)mysterymeatasyncio。ensurefuture(task)assertmysterymeatistask
  (L3)一个简单的什么都不做的协程函数。我们只需要一些能组成协程的东西。
  (L6)我们通过直接调用该函数来创建协程对象。你的代码很少会这样做,但我想在这里明确地表示,我们正在向每个createtask()和ensurefuture()传递一个协程对象。
  (L7)获取一个循环。
  (L9)首先,我们使用loop。createtask()在循环中调度协程,并返回一个新的Task实例。
  (L10)验证类型。到目前为止,没有什么有趣的。
  (L12)我们展示了asyncio。ensurefuture()可以被用来执行与createtask()相同的动作:我们传入了一个协程,并返回了一个Task实例(并且协程已经被安排在循环中运行)!如果传入的是协程,那么loop。createtask()和asyncio。ensurefuture()之间没有区别。
  (L15)如果我们给ensurefuture()传递一个Task实例会发生什么呢?注意我们要传递的Task实例是已经在第4步通过loop。createtask()创建好的。
  (L16)返回的Task实例与传入的Task实例完全相同:它在被传递时没有被改变。
  直接传递Future实例的意义何在?为什么用同一个函数做两件不同的事情?答案是,ensurefuture()的目的是让框架作者向最终用户开发者提供可以处理两种参数的API。不相信我?这是exBDFL自己说的:
  ensurefuture()的要点是,如果你有一个可能是协程或Future(后者包括一个Task,因为它是Future的子类)的东西,并且你想能够调用一个只在Future上定义的方法(可能唯一有用的例子是cancel())。当它已经是Future(或Task)时,它什么也不做;当它是协程时,它将它包装在Task中。
  如果您知道您有一个协程,并且希望它被调度,那么正确的API是createtask()。唯一应该调用ensurefuture()的时候是当你提供一个API(像大多数asyncio自己的API),它接受协程或Future,你需要对它做一些事情,需要你有一个Future。
  GuidovanRossum
  总而言之,asyncio。surefuture()是一个为框架设计者准备的辅助函数。这一点最容易通过与一种更常见的函数进行类比来解释,所以我们来做这个解释。如果你有几年的编程经验,你可能已经见过类似于例319中的istify()函数的函数。示例319中listify()的函数。
  示例319。一个强制输入列表的工具函数deflistify(x:Any)List:Tryhardtoconvertxintoalistifisinstance(x,(str,bytes)):return〔x〕try:return〔forinx〕exceptTypeError:return〔x〕
  这个函数试图将参数转换为一个列表,不管输入的是什么。api和框架中经常使用这类函数将输入强制转换为已知类型,这将简化后续代码在本例中,您知道参数(来自listify()的输出)将始终是一个列表。
  如果我将listify()函数重命名为ensurelist(),那么您应该开始看到与asyncio。ensurefuture()的类似之处:它总是试图将参数强制转换为Future(或子类)类型。这是一个实用函数,它使框架开发人员(而不是像你我这样的终端用户开发人员)的工作变得更容易。
  实际上,asyncio标准库模块本身使用ensurefuture()正是出于这个原因。当你下次查看API时,你会发现函数参数被描述为可等待对象,很可能内部使用ensurefuture()强制转换参数。例如,asyncio。gather()函数就像下面的代码一样:asyncio。gather(aws,loopNone,。。。)
  aws参数表示可等待对象,包括协程、task和future。在内部,gather()使用ensurefuture()进行类型强制转换:task和future保持不变,而把协程强制转为task。
  这里的关键是,作为终端用户应用程序开发人员,应该永远不需要使用asyncio。ensurefuture()。它更像是框架设计师的工具。如果你需要在事件循环上调度协程,只需直接使用asyncio。createtask()来完成。
  在接下来的几节中,我们将回到语言级别的特性,从异步上下文管理器开始。

海尔互联工厂成为灯塔工厂的秘密,都在这份用户体验里了近年来,智能化浪潮席卷而来。以用户熟悉的家庭场景为例,包括冰箱、洗衣机、空调在内,乃至门锁、窗帘等设备也变成智能家居的一部分。与此同时,制造业通过人工智能、物联网等新技术,生产……中国人的跑车红旗S9量产版发布百公里加速仅需1。9秒2021上海车展开幕,红旗旗下首款超级跑车正式发布量产版本,将以限量形式发售。【关注官方公号:chnbestcar】红旗S9概念车首次亮相于2019年的法兰克福车展,后来……iQOO35G的耳机口音质,比前作略有增强iQOO35G音质怎么样?跟vivo别的手机比如何?如果打分能打多少分?跟iphone、三星之类的手机比音质,又谁更高?我知道,点进来看这篇文的人,很多会想问……win10专业版电脑关机慢的解决方法有很多深度技术的用户都已经习惯使用win10系统了,但是总会出现一些电脑故障问题的,比如:有一位深度win10专业版的小伙伴出现了电脑关机慢的问题。别着急,深度系统官网小编就针……知乎版十万个为什么绘本发售打造新时代儿童科普教材《知乎版十万个为什么》绘本发售打造新时代儿童科普教材10月11日,知乎宣布联合少年儿童出版社正式发布《知乎版十万个为什么》科普绘本,面向儿童进行专业性、趣味性的科普通识教……你的G29方向盘有哪些问题?相信有许多热爱赛车游戏的小伙伴们和我一样都入手了G29,方向盘和键盘手柄相比,能为我们带来更加良好的体验。但是在使用过程中,出于对产品的不熟悉或者兼容情况,大家或多或少都……新华网亿连高校思政大数据平台上线新华网乌兰察布7月18日电新华网亿连高校思政大数据平台在乌兰察布2018中国创业创新博览会期间正式发布上线。据悉,新华网亿连建立的政产学研用深度融合的技术创新体系,将思想……让扫拖不再碰撞,米家扫拖机器人1T正式发布随着科技的发展,扫地机器人对于消费者而言已经不再陌生,它已经成为日常智能清洁中非常重要的组成部分,扫拖一体的进化更是让全球用户感受到科技改变生活的魅力所在。近日,小米在双……配48V轻混新款奔驰GLE300d海外上市启停系统更平顺据外媒报道,奔驰旗下的新款GLE300d车型在欧洲上市,作为小改款车型,新车的外形内饰都没有变动,主要是针对动力系统进行了升级。新车的售价为7。5万欧元,约合人民币55。76万……打破贤者时间的罪恶,爱必思003助你打破关系隔阂其实关于完事之后的状态,每个人都有不同的心得,但情感变化大致都是一样的,那就是无欲无求、空虚、孤独。。。于是人们把这段无欲无求的时期统称为贤者时间。有人说贤者时间最适合解……文章发在哪个平台,容易被搜索引擎收录从今年3月23开始,我坚持每天在公众号平台上更新原创文章,最初的想法很简单,就是想坚持做一件有意义的事情。当时文章只发布在微信公众号上,之后又把文章同步到今日头条上,一方……今早我遇到了一件意义很大的小事每天早上开车上班的路上,都要经过一个非常狭窄的小胡同,仅能通过一辆汽车,有行人的时候,一起通过就要谨慎些,所以我每次通过这里都会减速慢行。今早开车到这的时候,前方有一个人……
推动数字经济健康发展来源:人民网人民日报海外版近年来,互联网、大数据、云计算、人工智能、区块链等技术加速创新,日益融入经济社会发展各领域全过程,数字经济发展速度之快、辐射范围之广、影响程度之……美国半导体要重振雄风了?IBM宣布研发出最小最强的2纳米芯片据美国有线电视新闻网(CNN)6日报道,美国国际商业机器公司(IBM)在周四宣布,已经研发出了一种2纳米芯片。报道称,这是迄今为止最小、功能最强大的微芯片。CNN报道截图……iPhone12再夺第一,堆料是堆不出高端市场的自从去年10月iPhone12发布以来,这款手机就被不断唱衰,有不少网友认为iPhone12很难在国内市场上大卖,甚至有人断言苹果在走三星的老路。然而事实并非如此,自从i……基于以太坊的山寨币在短短一天内飙升了惊人的2,191最近进入加密市场的一种基于以太坊的山寨币在短短24小时内获得了近22倍的巨额收益。OpenDAO(SOS)在12月24日空投后价格出现了惊人的上涨。从CoinMar……主存是个啥?辅存又是啥?主存是啥?主存就是内存,比方说,我的电脑内存就是16GB,小而快。详细点:主存储器,指的就是主板上的存储部件CPU直接与之沟通,并用其存储数据存放当前正在使用的(即……想问下升级了鸿蒙系统的华为手机用户,会比EMUI11好用吗?特别流畅,功能增加,界面亲和。界面一样,有一点不一样,比安卓流畅多了,丝般顺滑我觉得比安卓好用,好玩的东西比较多,和安卓比,安卓显得比较乏味。鸿蒙系统非常好!……为什么st众泰股票委托卖不出去?ST众泰股票委托卖不出去的原因有以下三个:原因一:因为ST众泰不是涨停就是跌停,如果涨停的时候想卖出,挂低价就可以很快成交卖出的。但ST众泰跌停后,再度想卖就没这么……amd的1600CPU好不好用。配什么显卡好?1600并不建议买,最重要的原因就是作为第一代锐龙,有很多地方不完美,有些小问题最低2600,大众3600,追赶时代5600X,小资5800X板U套:电脑最不容易坏的,而……怎么学习Rasa框架开发1。怎么学习Rasa框架开发?建议报名Gavin大咖的Rasa3。x源码高手之路:系统架构、内核算法、源码实现详解课程,具体来说,该系统课程是以下五大课程的合集:1……小米11评测顶级旗舰的强大竞争对手但却不是最好的选择哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您小米终于发布了出了一部在任何地方上都不落后于其他的安卓旗舰的手机。小米11拥有目前可以最新的最快的高通处理器,……领先火灾预警技术看辰安天泽消防智能化应用新突破欢迎关注消防大业微信公众号:xfdy119。现今,消防领域的科技化、创新化发展逐渐成为主流理念和趋势,利用信息化手段,实现安全风险分类、分析、自动预警是消防智能化应用的必……2019美国最有价值的100大品牌榜,亚马逊蝉联第一Netf英国品牌评估机构品牌金融(BrandFinance)发布2019美国最有价值的500大品牌排行榜(US5002019)。亚马逊以1879亿美元蝉联第一,Netflix成为价值增……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网