code: def new_job(self, task, inputdata, launcher_name="Unknown", debug=False):
          
          job_semaphore = threading.Semaphore(0)
  
          def manage_output(result, grade, problems, tests, custom, state, archive, stdout, stderr):
              """ Manages the output of this job """
              manage_output.job_return = (result, grade, problems, tests, custom, state, archive, stdout, stderr)
              job_semaphore.release()
  
          manage_output.job_return = None
  
          self._client.new_job(task, inputdata, manage_output, launcher_name, debug)
          job_semaphore.acquire()
          job_return = manage_output.job_return
          return job_return
docs: Runs a new job.
              It works exactly like the Client class, instead that there is no callback and directly returns result, in the form of a tuple
              (result, grade, problems, tests, custom, archive).