async def _stop_process(self, process: Process): """Stop a process Args: process (Process): the process to stop """ if process.returncode is None: process.terminate() try: await asyncio.wait_for(process.wait(), 5) except asyncio.TimeoutError: process.kill()
async def wait_for_child_process(child: Process, timeout: int) -> Tuple[bytes, int, bool]: try: output, _ = await asyncio.wait_for(child.communicate(), timeout=timeout) timed_out = False returncode = child.returncode if child.returncode else 0 except asyncio.TimeoutError: timed_out = True returncode = -9 try: child.terminate() # Give mpiexec a chance to shutdown except ProcessLookupError: pass output, _ = await child.communicate() return output, returncode, timed_out