future和the future,future是什么意思

  future和the future,future是什么意思

  由任务和协同程序翻译的Python官方文档

  这个问题恶心的地方在于,要理解协程,就要理解未来和任务。如果你想了解未来和任务,你应该首先了解协程。所以我第一次看公文的时候,感觉完全是在梦游。但是当我读第二遍,第三遍的时候,就清楚多了。

  协程协程包括两个概念:

  协同函数(async def或@asyncio.coroutine)协同函数返回的协同对象。协同功能:

  通过result=await future或result=yeild从future挂起协同过程,直到future完成,得到future的结果/异常(参见下面对future和future结果的描述,或者看完future回来再看本段)。等待另一个协程的结果by result=await协程或result=yeild from协程(或exception,将传播异常)。Returen表达式返回此协程的结果,该结果由await或yield from获得。引发异常、抛出异常、通过await获取异常或从。调用协程函数不会使协程运行。调用协程函数返回的协程对象不会做任何事情,直到它被安排由您执行。有两种方法可以启动它:

  调用:在已经启动的协程中等待协程或者从协程中让步,或者通过guarantee _ task()和loop.create_task()安排协程的执行。只有当事件循环运行时,协同流程才能运行。

  在本文档中,一些常用函数返回一个未来值,该值也被标记为协同例程。这是故意的,让你以后可以自由使用这些功能。如果回调代码中使用了这个函数,就用guarantee _ future把它包装起来。

  hello_world.py

  进口异步

  #创建协程

  异步定义hello_world():

  print(Hello World!)

  loop=asyncio.get_event_loop()

  #阻塞调用,当hello_world()协程完成时返回

  #在事件循环中调用此协程

  #但是这里只有一个协同学,而且没有被屏蔽。

  loop . run _ until _ complete(hello _ world())

  loop.close()hello_world2.py

  #这段代码的执行结果与上面的代码相同。这只是调用协程的另一种方式。

  #先在loop.call_soon()中安排,然后通过loop.run_forever()调用

  #注意在hello_world这里调用了loop.stop(),否则事件循环不会终止。

  进口异步

  def hello_world(循环):

  打印(“Hello World”)

  loop.stop()

  loop=asyncio.get_event_loop()

  #安排打电话给hello_world()

  loop.call_soon(hello_world,loop)

  #阻塞调用被loop.stop()中断

  loop.run_forever()

  loop.close()

  请注意,返回1 2实际上是raise StopIteration(3)协同流程,它实际上一直返回结果。最终结果将被返回。

  Future future是一个容器或占位符,用于接受异步结果。这里指的是asyncio。未来而不是协程

  接口结果()

  返回未来set_result()的结果

  表示未来已经结束,并赋值。请注意,必须显式调用此接口来为未来赋值。

  进口异步

  #为未来赋值的函数

  异步定义慢速运行(未来):

  等待睡眠(1)

  #为未来分配价值

  future.set_result(未来完成了!)

  loop=asyncio.get_event_loop()

  #创造未来

  future1=asyncio。未来()

  #使用“确保未来”创建任务

  asyncio.ensure _ future(慢速操作(future1))

  future2=asyncio。未来()

  asyncio.ensure _ future(慢速操作(future2))

  #收集任务,并通过run_uniti_complete开始和停止循环。

  loop . run _ until _ complete(asyncio . gather(future 1,future2))

  print(future1.result())

  print(future2.result())

  Loop.close()如果我们注释掉 future . set _ result( future done!)一句台词,这个节目永远不会结束。

  安排一个协同任务的执行过程:把它包在一个未来。是Task Future的子类。

  任务负责在实现循环中执行协程。如果包装的流程是由未来生成的,task将暂停包装的流程的执行,并等待未来的完成。当未来结束时,打包的进程将重新启动,当未来结果/异常返回时。

  事件周期使用协作调度:事件周期一次只能执行一个操作。其他任务可以在其他线程的事件循环中执行。当任务等待未来结束时,事件循环将执行一个新的任务。

  取消任务不同于取消未来。调用cancel()将向包装的协程抛出CacelledError。只有当包装的协同例程没有捕获CacaleError或抛出CacelledError时,Cancelled()才会返回True。

  太长了,就不翻译了。也就是说,虽然task的cancel()函数只会抛出一个异常给被包装的协程,但是任务是否真的被取消取决于被包装的协程如何处理这个异常。

  不要直接创建任务实例,而是使用确保_未来()函数或loop.create_task()方法。

  任务关联函数asyncio.guarantee _ future

  安排协议的执行。以后包起来,还一个任务。asyncio . gather(* coros _ or _ futures,loop=None,return_exceptions=False)

  将多个过程或未来整合成一个未来。

  的所有未来必须在事件循环中。如果所有未来都成功完成,所有结果将按输入的顺序返回(不是返回的顺序)。asyncio.sleep(delay,result=None,*,loop=None)

  sleep函数,注意它可以返回结果。

  转载请联系作者授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: