gh-88050: Fix asyncio subprocess to kill process cleanly when process is blocked (#32073)

This commit is contained in:
Kumar Aditya 2022-10-05 22:45:31 +05:30 committed by GitHub
parent 0e72606dd4
commit 7015e13797
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 33 additions and 6 deletions

View file

@ -1,4 +1,5 @@
import os
import shutil
import signal
import sys
import unittest
@ -182,6 +183,30 @@ class SubprocessMixin:
else:
self.assertEqual(-signal.SIGKILL, returncode)
def test_kill_issue43884(self):
blocking_shell_command = f'{sys.executable} -c "import time; time.sleep(100000000)"'
creationflags = 0
if sys.platform == 'win32':
from subprocess import CREATE_NEW_PROCESS_GROUP
# On windows create a new process group so that killing process
# kills the process and all its children.
creationflags = CREATE_NEW_PROCESS_GROUP
proc = self.loop.run_until_complete(
asyncio.create_subprocess_shell(blocking_shell_command, stdout=asyncio.subprocess.PIPE,
creationflags=creationflags)
)
self.loop.run_until_complete(asyncio.sleep(1))
if sys.platform == 'win32':
proc.send_signal(signal.CTRL_BREAK_EVENT)
# On windows it is an alias of terminate which sets the return code
proc.kill()
returncode = self.loop.run_until_complete(proc.wait())
if sys.platform == 'win32':
self.assertIsInstance(returncode, int)
# expect 1 but sometimes get 0
else:
self.assertEqual(-signal.SIGKILL, returncode)
def test_terminate(self):
args = PROGRAM_BLOCKED
proc = self.loop.run_until_complete(