python / python/cpython

Add `close()` method to `asyncio.StreamReader`

Abierto
#130,925 2 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

stdlib topic-asyncio type-feature
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Feature or enhancement

Proposal:

When creating a sub-process using asyncio.create_subprocess_exec(), it returns a Process instance that has a stdout property. This property is intended to be an asyncio version of the stdout property of the Popen instance from the subprocess module.

An important aspect of Popen.stdout property is that you can close it. This is a signal to the sub-process that is generating output that it should cleanly terminate. This is a common pattern in processes used in shell pipelines. Indeed, the object located at Popen.stdout has a close() method. This pattern is demonstrated below:

import subprocess
proc = subprocess.Popen(["yes"], stdout=subprocess.PIPE) # start subprocess
data = proc.stdout.read(4096) # get data
proc.stdout.close() # signal to process to cleanly shutdown
proc.wait() # wait for shutdown

Unfortunately this pattern cannot be reproduced easily with the stdout property of the Process instance returned from asyncio.create_subprocess_exec() because stdout is an instance of StreamReader which does not have the close() method.

I propose adding a close() method to the StreamReader class so that asyncio version of the subprocess module may support this pattern of managing sub-processes. This change is consistent with the asyncio ecosystem as the companion StreamWriter class already has a close() method, along with other methods that expose its inner "transport" object. It's also trivial to implement, since it's essentially a wrapper method around the inner transport object's close() method.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs
  • gh-130929

Guía de contribución

Abrir la guía de contribución

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 localizando la implementación de asyncio.StreamReader y la ruta de salida stdout de subprocess utilizada por asyncio.create_subprocess_exec(). Revisa el PR vinculado gh-130929 para consultar el trabajo que ya está en curso y, después, verifica que la salida de subprocess basada en StreamReader admita el comportamiento de cierre solicitado.

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

Evaluación

Stack tecnológico
python
Área
networking
Tipo de issue
Nueva funcionalidad
Dificultad
3/5
Tiempo estimado
1-2 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
30/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.