【问题标题】:Python 3.7 - asyncio.sleep() and time.sleep()Python 3.7 - asyncio.sleep() 和 time.sleep()
【发布时间】:2019-11-05 20:36:44
【问题描述】:

当我转到asyncio 页面时,第一个示例是一个hello world 程序。当我在 python 3.73 上运行它时,我看不出与正常的有什么不同,谁能告诉我区别并举一个重要的例子吗?

In [1]: import asyncio
   ...:
   ...: async def main():
   ...:     print('Hello ...')
   ...:     await asyncio.sleep(5)
   ...:     print('... World!')
   ...:
   ...: # Python 3.7+
   ...: asyncio.run(main())
Hello ...
... World!

In [2]:

In [2]: import time
   ...:
   ...: def main():
   ...:     print('Hello ...')
   ...:     time.sleep(5)
   ...:     print('... World!')
   ...:
   ...: # Python 3.7+
   ...: main()
Hello ...
... World!

我故意将时间从 1s 增加到 5s,希望看到一些特别的东西但我没有。

【问题讨论】:

标签: python python-3.x python-asyncio python-3.7


【解决方案1】:

您没有看到任何特别之处,因为您的代码中没有太多异步工作。但是,主要区别在于time.sleep(5) 是阻塞的,asyncio.sleep(5) 是非阻塞的。

time.sleep(5) 被调用时,它会阻塞脚本的整个执行并且会被搁置,只是冻结,什么都不做。但是当你调用 await asyncio.sleep(5) 时,它会在你的 await 语句完成执行时要求事件循环运行其他东西。

这是一个改进的例子。

import asyncio

async def hello():
    print('Hello ...')
    await asyncio.sleep(5)
    print('... World!')

async def main():
    await asyncio.gather(hello(), hello())

asyncio.run(main())

将输出:

~$ python3.7 async.py
Hello ...
Hello ...
... World!
... World!

您可以看到await asyncio.sleep(5) 没有阻止脚本的执行。

希望对你有帮助:)

【讨论】:

  • 我的一些解释帮助我理解了同步与异步睡眠 - 如果您需要暂停整个脚本(应该同时工作)执行,那就是睡眠。如果需要暂停单个协程,就是 asyncio.sleep
  • 更正:您写了“当 time.sleep(5) 被调用时,它将阻止脚本的整个执行”。这仅适用于单线程脚本。但对于一般情况,这是不正确的。 time.sleep(5) 只阻塞当前线程。
  • @eyalzba 是的,这是有道理的。感谢您添加此评论 :)
  • 这应该是官方的“hello world”示例。
  • 感谢 stackoverflow.com 和像你这样的程序员,标准 PY 文档中的许多“漏洞”都被覆盖了。 (无法从docs.python.org/3/library/asyncio.html! 中挖掘出来)
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2015-05-18
  • 2019-05-04
相关资源
最近更新 更多