50 votes

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

Lorsque je vais sur la page asyncio, le premier exemple est un programme de bonjour monde. Lorsque je l'exécute sur python 3.73, je ne peux pas voir de différence par rapport à celui normal, quelqu'un peut-il me dire la différence et donner un exemple non trivial?

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

In [2]:

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

J'augmente intentionnellement le temps de 1s à 5s, espérant voir quelque chose de spécial mais je n'ai pas vu.

85voto

user3571366 Points 79

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 bloquant, et asyncio.sleep(5) est non bloquant.

Lorsque vous appelez time.sleep(5), cela bloquera l'exécution entière du script et le mettra en attente, simplement figé, ne faisant rien. Mais lorsque vous appelez await asyncio.sleep(5), cela demandera à la boucle événementielle d'exécuter autre chose pendant que votre instruction d'attente termine son exécution.

Voici un exemple amélioré.

import asyncio

async def hello():
    print('Bonjour...')
    await asyncio.sleep(5)
    print('... le Monde!')

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

asyncio.run(main())

Produira:

~$ python3.7 async.py
Bonjour...
Bonjour...
... le Monde!
... le Monde!

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

J'espère que cela vous aide :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X