<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def gather(self, *cmds: str) -> Tuple[int]: """Coroutine to spawn subprocesses and block until completion. Note: The same `max_concurrency` restriction that applies to `spawn` also applies here. Returns: The exit codes of the spawned subprocesses, in the order they were passed. """

        subprocs = self.spawn(*cmds)
        subproc_wait_coros = [subproc.wait_done() for subproc in subprocs]
        return await asyncio.gather(*subproc_wait_coros)