mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-88050: Fix asyncio subprocess to kill process cleanly when process is blocked (#32073)
This commit is contained in:
parent
0e72606dd4
commit
7015e13797
3 changed files with 33 additions and 6 deletions
|
@ -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(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue