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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。