web-dev-qa-db-fra.com

Python 3.7 - asyncio.sleep () et time.sleep ()

Lorsque je vais sur la page asyncio, le premier exemple est un programme Hello World. Quand je l'exécute sur python 3.73, Je ne vois rien de différent de la normale, quelqu'un peut-il me dire la différence et donner un exemple non trivial?

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!

J'augmente intentionnellement le temps de 1s à 5s, j'espère voir quelque chose de spécial mais je ne l'ai pas fait.

14

Vous ne voyez rien de spécial car il n'y a pas beaucoup de travail asynchrone dans votre code. Cependant, la principale différence est que time.sleep(5) est bloquante et asyncio.sleep(5) n'est pas bloquante.

Lorsque time.sleep(5) est appelé, il bloquera toute l'exécution du script et il sera mis en attente, juste gelé, sans rien faire. Mais lorsque vous appelez await asyncio.sleep(5), il demandera à la boucle d'événement d'exécuter autre chose pendant que votre instruction wait termine son exécution.

Voici un exemple amélioré.

import asyncio

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

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

asyncio.run(main())

Sortira:

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

Vous pouvez voir que await asyncio.sleep(5) ne bloque pas l'exécution du script.

J'espère que ça aide :)

21
Nimeshka Srimal