MagicStack / MagicStack/uvloop

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

Abierto
#739 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Lenguaje dominante
Cython
Estrellas
11.9k
Forks
616
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

## 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:

```python
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
```

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Comienza ejecutando la reproducción proporcionada con el bucle asyncio predeterminado y uvloop; después, rastrea cómo uvloop gestiona los temporizadores de asyncio.sleep. Compara la duración medida con el retraso solicitado y añade una prueba de regresión para el tiempo de suspensión mínimo. Se considera terminado cuando asyncio.sleep(n) no retorna antes de que haya transcurrido n.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
48/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.