python / python/cpython

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

Ouverte
#130,925 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

stdlib topic-asyncio type-feature
Langage dominant
Python
Étoiles
77.2k
Forks
36k
Métriques de merge des PR
Métriques de PR en attente

Description

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

Guide de contribution

Ouvrir le guide de contribution

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 localiser l’implémentation de asyncio.StreamReader et le chemin stdout de subprocess utilisé par asyncio.create_subprocess_exec(). Examinez le PR lié gh-130929 pour prendre connaissance du travail déjà en cours, puis vérifiez que la sortie de subprocess basée sur StreamReader prend en charge le comportement de fermeture demandé.

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

Évaluation

Stack technique
python
Domaine
networking
Type d'issue
Fonctionnalité
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
30/100

Recevez les nouvelles issues par e-mail

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