Python 3.7 - asyncio.sleep () и time.sleep () - PullRequest
0 голосов
/ 24 июня 2019

Когда я перехожу на страницу 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!

Я намеренно увеличиваю время с 1 до 5 с, надеюсь увидеть что-то особенное, но я этого не сделал.

1 Ответ

3 голосов
/ 24 июня 2019

Вы не видите ничего особенного, потому что в вашем коде нет ничего особенного асинхронного. Однако основное отличие состоит в том, что 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) не блокирует выполнение скрипта.

Надеюсь, это поможет:)

...