MagicStack / MagicStack/uvloop

uvloop may sleep less than `n` for asyncio.sleep(n)

Ouverte
#739 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Cython
Étoiles
11.9k
Forks
615
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

Bug Description

When calling asyncio.sleep, uvloop sometimes sleeps for fractionally less then the requested sleep time. E.g. await asyncio.sleep(0.1) -> Sleeps for 0.0991.

Expected behavior

Should always sleep for at least the specified time.

Environment

  • Operating System: Fedora 43
  • Python Version: Python 3.13.12
  • uvloop Version: 0.22.1

Steps to Reproduce

Run the following script and observe output:

import asyncio
import statistics
import time

async def main():
    sleep_times = []
    for _ in range(100):
        start_time = time.perf_counter()
        await asyncio.sleep(0.1)
        end_time = time.perf_counter()
        sleep_times.append(end_time - start_time)
    print(f"Min sleep time: {min(sleep_times):.4f} seconds")
    print(f"Max sleep time: {max(sleep_times):.4f} seconds")
    print(f"Average sleep time: {statistics.mean(sleep_times):.4f} seconds")

if __name__ == "__main__":
    print("With default asyncio event loop:")
    asyncio.run(main())
    print("With uvloop event loop:")
    import uvloop
    asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
    asyncio.run(main())

Output:

With default asyncio event loop:
Min sleep time: 0.1001 seconds
Max sleep time: 0.1008 seconds
Average sleep time: 0.1002 seconds
With uvloop event loop:
Min sleep time: 0.0991 seconds
Max sleep time: 0.1011 seconds
Average sleep time: 0.1001 seconds

Guide de contribution

Aucun guide de contribution indexé pour ce dépôt

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par exécuter la reproduction fournie avec la boucle asyncio par défaut et uvloop, puis suivez la manière dont uvloop gère les minuteurs de asyncio.sleep. Comparez la durée mesurée au délai demandé et ajoutez un test de régression pour la durée minimale de veille. C’est terminé lorsque asyncio.sleep(n) ne retourne pas avant que n se soit écoulé.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
backend
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
48/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.