Skip to content

Commit 210bfce

Browse files
committed
gh-105288: wake up exit waiters after sub-process exits
1 parent 1237fb6 commit 210bfce

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

Lib/asyncio/base_subprocess.py

+9-5
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,14 @@ def _process_exited(self, returncode):
217217
self._call(self._protocol.process_exited)
218218

219219
self._try_finish()
220+
self._wakeup_exit_waiters()
221+
222+
def _wakeup_exit_waiters(self):
223+
# wake up futures waiting for wait()
224+
for waiter in self._exit_waiters:
225+
if not waiter.cancelled():
226+
waiter.set_result(self._returncode)
227+
self._exit_waiters = []
220228

221229
async def _wait(self):
222230
"""Wait until the process exit and return the process return code.
@@ -242,11 +250,7 @@ def _call_connection_lost(self, exc):
242250
try:
243251
self._protocol.connection_lost(exc)
244252
finally:
245-
# wake up futures waiting for wait()
246-
for waiter in self._exit_waiters:
247-
if not waiter.cancelled():
248-
waiter.set_result(self._returncode)
249-
self._exit_waiters = None
253+
self._wakeup_exit_waiters()
250254
self._loop = None
251255
self._proc = None
252256
self._protocol = None
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Exit waiters are not resolved after subprocess handled by asyncio.Task
2+
exits. This will causes a recent `asyncio.wait` call hang forever if there
3+
are objects that are not `Awaitable` yield from its first parameter.

0 commit comments

Comments
 (0)