回答问题

当我进入asyncio页面时,第一个例子是一个hello world程序。当我在 python3.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!

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

Answers

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

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

这是一个改进的例子。

import asyncio

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

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

asyncio.run(main())

将输出:

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

可以看到await asyncio.sleep(1)并没有阻塞脚本的执行。

相反,将行await asyncio.sleep(1)替换为time.sleep(1),输出将是

Hello ...
... World!
Hello ...
... World!

因为time.sleep正在阻塞,并且hello()的第一次调用必须在hello()的第二次调用开始运行之前先完成。

希望能帮助到你 :)

Logo

Python社区为您提供最前沿的新闻资讯和知识内容

更多推荐