MagicStack / MagicStack/uvloop

uvloop runs at_fork hook when running subprocess

Abierto
#749 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

Speaking about os.register_at_fork python docs explicitly state:

These calls are only made if control is expected to return to the Python interpreter. A typical subprocess launch will not trigger them as the child is not going to re-enter the interpreter.

The standard asyncio loop behaves this way. But uvloop doesn't. Repro:

import asyncio
import os
   
import uvloop


def hook():
    os.write(2, b"TRIGGERED\n")
    
    
async def run():        
    process = await asyncio.create_subprocess_exec(
        "uptime",
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
        start_new_session=True
    )

    stdout, stderr = await process.communicate()
    print(f"STDOUT: {stdout.decode('utf-8').strip()}")
    

if __name__ == "__main__":
    os.register_at_fork(after_in_child=hook)

    print("asyncio")
    asyncio.run(run())
    
    print("uvloop")
    uvloop.install()
    asyncio.run(run())

Output:

asyncio
STDOUT: 16:56:42 up 35 days,  6:20,  1 user,  load average: 5.21, 4.34, 4.27
uvloop
TRIGGERED
STDOUT: 16:56:42 up 35 days,  6:20,  1 user,  load average: 5.21, 4.34, 4.27

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 trazando el manejo que hace uvloop de asyncio.create_subprocess_exec y la ruta de fork utilizada después de uvloop.install(), comparándola con el bucle estándar de asyncio y el comportamiento de os.register_at_fork. Vuelve a ejecutar la reproducción proporcionada con el subproceso uptime; se considera terminado cuando el hook after_in_child no se activa para este lanzamiento del subproceso.

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

Evaluación

Stack tecnológico
python
Área
operating-systems
Tipo de issue
Error
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
58/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.