【问题标题】:what does `yield from asyncio.sleep(delay)` do?`yield from asyncio.sleep(delay)` 有什么作用?
【发布时间】:2018-02-22 18:46:02
【问题描述】:

以下 Python in a 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) 为主程序提供什么值?

谢谢。

【问题讨论】:

标签: python python-3.x asynchronous


【解决方案1】:

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

“完成”只是表示协程中的任务已经完成。

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

【讨论】:

  • 谢谢。 (1) “完成”只是表示任务完成。你的意思是协程对象(由sleep 返回)完成了它的执行? (2) 你能举一个“有其他并行任务/协程正在运行”的例子吗?
  • (3) " 如果提供了结果,则在协程完成时将其生成给调用者。"既然result在这里是1.5,为什么3而不是1.5分配给x
  • (2) 您可以建立将并行运行的异步函数的任务列表。如果你使用异步睡眠它只会睡眠一个任务如果你使用同步睡眠它将睡眠整个过程(1)是
  • (3) 我不理解,你从哪里得到这些值?
  • 抱歉有些错别字。应该是:“如果提供了结果,则在协程完成时将其生成给调用者。”既然这里的结果是 1.5,为什么分配给x 的是 23 而不是 1.5?
【解决方案2】:

以下代码行:

time.sleep(5)

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

以下代码:

asyncio.sleep(5)

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

yield from 关键字(python 3.5 及更高版本可以使用 await 关键字)是事件循环有机会完成一项任务的时刻(例如,当从数据库返回查询时call) 并专注于事件循环知道并且同时可以实际计算/执行的另一个任务。

@asyncio.coroutine 装饰器 + yield from 与 python 3.5 及更高版本兼容,但使用新关键字 async def 定义异步协程和其中的 await 关键字以允许事件循环评估切换到另一个任务是常见的,并且如果你是 3.5 或以上,未来的证明方法。

Asyncronous python 可能很难理解,但前几年有很多关于这个主题的优秀 pycon 演讲 - 在 Youtube 上寻找一个,如果当然阅读文档?

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 2016-06-01
    • 1970-01-01
    • 2017-10-30
    • 2023-01-25
    • 2020-09-06
    • 2015-07-28
    • 2021-07-01
    • 2020-05-30
    相关资源
    最近更新 更多