Skip to content

Commit

Permalink
pythongh-108973: Fix asyncio SubprocessProtocol doc (python#109431)
Browse files Browse the repository at this point in the history
SubprocessProtocol process_exited() method can be called before
pipe_data_received() and pipe_connection_lost() methods. Document it
and adapt the example in the doc.

Co-authored-by: Davide Rizzo <[email protected]>
(cherry picked from commit ced6924)
  • Loading branch information
vstinner committed Sep 20, 2023
1 parent 17a335d commit 5a7d444
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 6 deletions.
10 changes: 5 additions & 5 deletions Doc/library/asyncio-llapi-index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -484,19 +484,19 @@ Protocol classes can implement the following **callback methods**:
:widths: 50 50
:class: full-width-table

* - ``callback`` :meth:`pipe_data_received()
<SubprocessProtocol.pipe_data_received>`
* - ``callback`` :meth:`~SubprocessProtocol.pipe_data_received`
- Called when the child process writes data into its
*stdout* or *stderr* pipe.

* - ``callback`` :meth:`pipe_connection_lost()
<SubprocessProtocol.pipe_connection_lost>`
* - ``callback`` :meth:`~SubprocessProtocol.pipe_connection_lost`
- Called when one of the pipes communicating with
the child process is closed.

* - ``callback`` :meth:`process_exited()
<SubprocessProtocol.process_exited>`
- Called when the child process has exited.
- Called when the child process has exited. It can be called before
:meth:`~SubprocessProtocol.pipe_data_received` and
:meth:`~SubprocessProtocol.pipe_connection_lost` methods.


Event Loop Policies
Expand Down
19 changes: 18 additions & 1 deletion Doc/library/asyncio-protocol.rst
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,9 @@ factories passed to the :meth:`loop.subprocess_exec` and

Called when the child process has exited.

It can be called before :meth:`~SubprocessProtocol.pipe_data_received` and
:meth:`~SubprocessProtocol.pipe_connection_lost` methods.


Examples
========
Expand Down Expand Up @@ -1003,12 +1006,26 @@ The subprocess is created by the :meth:`loop.subprocess_exec` method::
def __init__(self, exit_future):
self.exit_future = exit_future
self.output = bytearray()
self.pipe_closed = False
self.exited = False

def pipe_connection_lost(self, fd, exc):
self.pipe_closed = True
self.check_for_exit()

def pipe_data_received(self, fd, data):
self.output.extend(data)

def process_exited(self):
self.exit_future.set_result(True)
self.exited = True
# process_exited() method can be called before
# pipe_connection_lost() method: wait until both methods are
# called.
self.check_for_exit()

def check_for_exit(self):
if self.pipe_closed and self.exited:
self.exit_future.set_result(True)

async def get_date():
# Get a reference to the event loop as we plan to use
Expand Down

0 comments on commit 5a7d444

Please sign in to comment.