首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从asyncio.sleep(延迟)`得到什么?

从asyncio.sleep(延迟)`得到什么?
EN

Stack Overflow用户
提问于 2018-12-12 04:40:39
回答 2查看 0关注 0票数 0

以下来自Nutshell中Python的示例设置 x23 延迟一秒半之后:

代码语言:javascript
复制
@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)为主体计划提供了什么?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-12-12 12:41:52

以下代码行:

代码语言:javascript
复制
time.sleep(5)

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

以下代码:

代码语言:javascript
复制
asyncio.sleep(5)

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

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

@ asyncio.coroutine装饰+从输出与Python 3.5起兼容,但使用new关键字异步高清定义一个asyncronous协同程序及其内部的await关键字,让事件循环来评估切换到另一项任务是共同的,面向未来的方式如果你是3.5版本或以上。

Asyncronous python在过去的几年中有很多关于这个主题的优秀pycon会谈

票数 0
EN

Stack Overflow用户

发布于 2018-12-12 14:07:18

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100003058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档