从asyncio.sleep(延迟)中得到什么呢?

时间:2017-09-13 22:51:13

标签: python python-3.x asynchronous

以下Nutshell中的示例在延迟一秒半之后将x设置为23

@asyncio.coroutine
def delayed_result(delay, result):
  yield from asyncio.sleep(delay)
  return result

loop = asyncio.get_event_loop()
x = loop.run_until_complete(delayed_result(1.5, 23))

我觉得很难理解yield from asyncio.sleep(delay)的作用。

来自https://docs.python.org/3/library/asyncio-task.html#asyncio.sleep

Coroutine asyncio.sleep(delay, result=None, *, loop=None)
     

创建一个在给定时间(以秒为单位)后完成的协同程序。如果   提供结果,当协同程序产生给调用者   完成。

所以asyncio.sleep(delay)返回一个协程对象。

协程对象“完成”是什么意思?

yield from asyncio.sleep(delay)为主程序提供了哪些值?

感谢。

2 个答案:

答案 0 :(得分:15)

以下代码行:

time.sleep(5)

...冻结代码执行5秒钟。在睡眠功能完成5秒钟之后,没有进一步计算或执行任何操作,因为如果没有睡眠功能将控制权返回给呼叫者,则应用程序无法继续。这称为同步编程,当没有机制让应用程序更改其焦点并在等待期间完成其他任务时,例如等待调用数据库,web api或在本例中为睡眠函数的结果。在同步编程中,不需要事件循环,因为不期望应用程序管理其时间,也不会切换任务以提高效率。

以下代码:

asyncio.sleep(5)

...是asyncio库的一部分,专为异步编程设计,其中为事件循环分配要竞争的任务,它(事件循环)监视其所有任务和开关的状态从一个到另一个,目的是尽量减少闲置/等待的时间。这不是同时执行多个进程的线程,这只是优化任务执行,因此CPU不会空闲,因此大大减少了总体执行时间。

关键字的结果(可以使用python 3.5以后的await关键字)是事件循环有机会完成任务的时刻(例如,从数据库返回查询时)调用)并专注于事件循环知道的另一个任务,并且可以在此期间实际计算/执行。

@ asyncio.coroutine decorator + yield from与python 3.5以后兼容,但使用new关键字async def来定义异步协同程序,并在其中使用await关键字以允许事件循环评估切换到另一个任务是常见的如果你是3.5或以上,将来的证据。

Asyncronous python可能很难让你头脑发热,但是在过去的几年中有很多关于这个主题的优秀pycon演讲 - 在Youtube上寻找一个并且如果课程阅读文档那么

答案 1 :(得分:-1)

yield from是3.5 await的python3.4语法,这可能更有意义。

“完成”只意味着协程中的任务已经完成。

在这种情况下,您希望使用异步睡眠,以便在睡眠任务运行时计算其他任务,如果您正在运行其他并行任务/协程,则更有意义。