asyncio.sleep() vs tiempo.sleep()

2 minutos de lectura

avatar de usuario
una oferta no se puede rechazar

cuando voy a la asyncio página, el primer ejemplo es un programa hola mundo. Cuando lo ejecuto en python 3.73no puedo ver nada diferente al normal, ¿Alguien puede decirme la diferencia y dar un ejemplo no 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!

Aumenté intencionalmente el tiempo de 1 a 5 segundos, espero ver algo especial, pero no lo hice.

  • hay muchos recursos sobre esto por ahí… este es uno: realpython.com/async-io-python

    -hiro protagonista

    24 de junio de 2019 a las 4:27

  • ¿Esperabas algo diferente?

    – Kenny Ostrom

    24 de junio de 2019 a las 4:29

  • @KennyOstrom Sí, creo que un ejemplo debería ser el más simple y no trivial

    – una oferta no se puede rechazar

    24 de junio de 2019 a las 4:38

  • Sobre asyncio.sleep precisión stackoverflow.com/a/65727201/13782669

    – alex_noname

    23 de enero de 2021 a las 7:08

No está viendo nada especial porque no hay mucho trabajo asíncrono en su código. Sin embargo, la principal diferencia es que time.sleep(5) está bloqueando y asyncio.sleep(5) no es bloqueante.

Cuando time.sleep(5) se llama, bloqueará toda la ejecución del script y se pondrá en espera, simplemente congelado, sin hacer nada. Pero cuando llamas await asyncio.sleep(5)le pedirá al ciclo de eventos que ejecute otra cosa mientras su declaración de espera finaliza su ejecución.

Aquí hay un ejemplo mejorado.

import asyncio

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

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

asyncio.run(main())

Saldrá:

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

Puedes ver eso await asyncio.sleep(5) no está bloqueando la ejecución del script.

Espero eso ayude 🙂

  • alguna explicación mía que me ayudó a comprender la sincronización frente a la suspensión asíncrona: si necesita pausar la ejecución de un script completo (se supone que funciona al mismo tiempo), es suspensión. Si necesita pausar una sola rutina, es asyncio.sleep

    – Vladímir Kolenov

    24 de junio de 2019 a las 6:38


  • Corrección: escribió “Cuando se llama a time.sleep(5), bloqueará toda la ejecución del script”. Esto es cierto solo para secuencias de comandos de un solo subproceso. Pero para el caso general esto es incorrecto. time.sleep(5) bloquea solo el hilo actual.

    – eyalzba

    6 de febrero de 2020 a las 10:38

  • @eyalzba sí, tiene sentido. Gracias por agregar este comentario 🙂

    – Nimeshka Srimal

    6 de febrero de 2020 a las 10:43

  • Este debería ser el ejemplo oficial de “hola mundo”.

    – CS

    5 de julio de 2020 a las 4:56

  • Gracias a stackoverflow.com y programadores como usted, se cubrieron muchos “agujeros” en la documentación PY estándar. (Uno no podría desenterrar esto de docs.python.org/3/library/asyncio.html!)

    – Apóstoles

    27 mayo 2021 a las 15:05

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad