classification
Title: Script using ProactorEventLoop does not exit cleanly when subprocesses are spawned.
Type: behavior Stage:
Components: asyncio, Windows Versions: Python 3.7, Python 3.6, Python 3.5
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: asvetlov, cr1901, paul.moore, steve.dower, tim.golden, yselivanov, zach.ware
Priority: normal Keywords:

Created on 2019-06-23 22:35 by cr1901, last changed 2019-06-24 01:07 by cr1901.

Messages (2)
msg346345 - (view) Author: William D. Jones (cr1901) Date: 2019-06-23 22:35
On Windows 7, when using ProactorEventLoop, when asyncio.subprocess.terminate is called on the last subprocess when multiple subprocesses are spawned*, the last subprocess will never exit, and the Python interpreter will never exit. 

Spawning an instance of "TASKKILL /F" to kill the subprocess, and then awaiting asyncio.subprocess.wait is a workaround. Since both "TASKKILL /F" and asyncio.subprocess.terminate ultimately call TerminateProcess, I would expect the same behavior using both (without the need to wait for the subprocess to actually die).

I have confirmed this behavior on Python 3.5, 3.6, and 3.7 on both MSVC and MinGW Python (although I most frequently use the latter).

Zip file is too large, so I have a GH repo (ready to run) demonstrating this issue: https://github.com/cr1901/proactor

An example run looks like the following:$ python3 proactor.py
Infinite Loop, Iteration 0
Finite Loop, Iteration 0
Infinite Loop, Iteration 1
Finite Loop, Iteration 1
Infinite Loop, Iteration 2
Finite Loop, Iteration 2
Finite Loop, Iteration 3
Infinite Loop, Iteration 3
Infinite Loop, Iteration 4
Task poller finished.

The interpreter hangs after the "Task poller finished." line, which makes me believe that the Python interpreter is trying and failing to cleanup resources for some reason (IOCP never completes?).

*Each subprocess is associated with its own coroutine to handle standard output.
msg346346 - (view) Author: William D. Jones (cr1901) Date: 2019-06-23 22:59
Update: It turns out multiple spawned subprocesses are NOT required. If I replace "(short_fut, _) = await spawn()" with "short_fut = asyncio.ensure_future(asyncio.sleep(4))", the hang still occurs.
History
Date User Action Args
2019-06-24 01:07:24cr1901settitle: Script using ProactorEventLoop does not exit cleanly on Windows with multiple subprocesses -> Script using ProactorEventLoop does not exit cleanly when subprocesses are spawned.
2019-06-23 22:59:00cr1901setmessages: + msg346346
2019-06-23 22:35:46cr1901create