python / python/cpython

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

Offen
#130,925 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

stdlib topic-asyncio type-feature
Vorherrschende Sprache
Python
Sterne
77.2k
Forks
35.9k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, die Implementierung von asyncio.StreamReader und den von asyncio.create_subprocess_exec() verwendeten subprocess-stdout-Pfad zu finden. Sieh dir den verknüpften PR gh-130929 zu den bereits laufenden Arbeiten an und überprüfe anschließend, ob die auf StreamReader basierende Ausgabe von subprocess das angeforderte Verhalten beim Schließen unterstützt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
networking
Issue-Typ
Feature
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.