(Merge 3.4) asyncio, tulip issue 190: Process.communicate() now ignores
ConnectionResetError too
This commit is contained in:
commit
edfdf54790
|
@ -191,9 +191,9 @@ Process
|
|||
process, or ``None``, if no data should be sent to the child. The type
|
||||
of *input* must be bytes.
|
||||
|
||||
If a :exc:`BrokenPipeError` is raised when writing *input* into stdin,
|
||||
the exception is ignored. It occurs when the process exits before all
|
||||
data are written into stdin.
|
||||
If a :exc:`BrokenPipeError` or :exc:`ConnectionResetError` exception is
|
||||
raised when writing *input* into stdin, the exception is ignored. It
|
||||
occurs when the process exits before all data are written into stdin.
|
||||
|
||||
:meth:`communicate` returns a tuple ``(stdoutdata, stderrdata)``.
|
||||
|
||||
|
@ -210,7 +210,8 @@ Process
|
|||
This method is a :ref:`coroutine <coroutine>`.
|
||||
|
||||
.. versionchanged:: 3.4.2
|
||||
The method now ignores :exc:`BrokenPipeError`.
|
||||
The method now ignores :exc:`BrokenPipeError` and
|
||||
:exc:`ConnectionResetError`.
|
||||
|
||||
.. method:: kill()
|
||||
|
||||
|
|
|
@ -139,17 +139,19 @@ class Process:
|
|||
|
||||
@coroutine
|
||||
def _feed_stdin(self, input):
|
||||
debug = self._loop.get_debug()
|
||||
self.stdin.write(input)
|
||||
if self._loop.get_debug():
|
||||
if debug:
|
||||
logger.debug('%r communicate: feed stdin (%s bytes)',
|
||||
self, len(input))
|
||||
try:
|
||||
yield from self.stdin.drain()
|
||||
except BrokenPipeError:
|
||||
# ignore BrokenPipeError
|
||||
pass
|
||||
except (BrokenPipeError, ConnectionResetError) as exc:
|
||||
# communicate() ignores BrokenPipeError and ConnectionResetError
|
||||
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)
|
||||
self.stdin.close()
|
||||
|
||||
|
|
Loading…
Reference in New Issue