Commit edfdf547 authored by Victor Stinner's avatar Victor Stinner

(Merge 3.4) asyncio, tulip issue 190: Process.communicate() now ignores

ConnectionResetError too
parents 0d35741b d55b54d5
...@@ -191,9 +191,9 @@ Process ...@@ -191,9 +191,9 @@ Process
process, or ``None``, if no data should be sent to the child. The type process, or ``None``, if no data should be sent to the child. The type
of *input* must be bytes. of *input* must be bytes.
If a :exc:`BrokenPipeError` is raised when writing *input* into stdin, If a :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is
the exception is ignored. It occurs when the process exits before all raised when writing *input* into stdin, the exception is ignored. It
data are written into stdin. occurs when the process exits before all data are written into stdin.
:meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``. :meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``.
...@@ -210,7 +210,8 @@ Process ...@@ -210,7 +210,8 @@ Process
This method is a :ref:`coroutine <coroutine>`. This method is a :ref:`coroutine <coroutine>`.
.. versionchanged:: 3.4.2 .. versionchanged:: 3.4.2
The method now ignores :exc:`BrokenPipeError`. The method now ignores :exc:`BrokenPipeError` and
:exc:`ConnectionResetError`.
.. method:: kill() .. method:: kill()
......
...@@ -139,17 +139,19 @@ class Process: ...@@ -139,17 +139,19 @@ class Process:
@coroutine @coroutine
def _feed_stdin(self, input): def _feed_stdin(self, input):
debug = self._loop.get_debug()
self.stdin.write(input) self.stdin.write(input)
if self._loop.get_debug(): if debug:
logger.debug('%r communicate: feed stdin (%s bytes)', logger.debug('%r communicate: feed stdin (%s bytes)',
self, len(input)) self, len(input))
try: try:
yield from self.stdin.drain() yield from self.stdin.drain()
except BrokenPipeError: except (BrokenPipeError, ConnectionResetError) as exc:
# ignore BrokenPipeError # communicate() ignores BrokenPipeError and ConnectionResetError
pass if debug:
logger.debug('%r communicate: stdin got %r', self, exc)
if self._loop.get_debug(): if debug:
logger.debug('%r communicate: close stdin', self) logger.debug('%r communicate: close stdin', self)
self.stdin.close() self.stdin.close()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment