def METHOD_NAME(self, jobs: typing.List[Job]):
    """
    Run the given jobs in parallel.
    Start a process for each Job. The stdout and stderr for each process is written to the
    terminal. Processes that exited with code 0 or were cancelled are output first,
    followed by any processes that failed. If any jobs failed, one of the failed jobs' exit
    code will be used to exit this process.
    Args:
        jobs: A list of Jobs to run.
    """
    if not jobs:
        click.echo("No jobs!", err=True)
        sys.exit(3)
    progress_reporter = ProgressReporter(jobs)
    progress_reporter.print_status()
    processes = [self.loop.create_task(j.run()) for j in jobs]
    return_when: str = asyncio.ALL_COMPLETED
    if self.options["failfast"]:
        return_when = asyncio.FIRST_EXCEPTION
    future = asyncio.wait(processes, return_when=return_when)
    self.loop.add_signal_handler(signal.SIGINT, functools.partial(_cancel_jobs, jobs))
    try:
        done, pending = self.loop.run_until_complete(future)
        results = self._process_results(done, pending)
    finally:
        self._stop_all_jobs()
    # Now it's time to print any error output we collected, then exit or return.
    if results['returncode']:
        click.echo(results['error_output'], err=True)
        sys.exit(results['returncode'])