Args: Accepts a list of GPJob objects

        This method will not return until all GPJob objects in the list have
        finished running. That us, they are either complete and have resulted in
        an error state.

        This method will occasionally query each job to see if it is finished.

def wait_until_complete(job_list):
        """
        Args: Accepts a list of GPJob objects

        This method will not return until all GPJob objects in the list have
        finished running. That us, they are either complete and have resulted in
        an error state.

        This method will occasionally query each job to see if it is finished.
        """
        complete = [False] * len(job_list)
        wait = 1
        while not all(complete):
            time.sleep(wait)
            for i, job in enumerate(job_list):
                if not complete[i]:
                    complete[i] = job.is_finished()
                    if not complete[i]:
                        break
            wait = min(wait * 2, 10)