def execute_runner_async(runner, workunit_factory=None, workunit_name=None, workunit_labels=None,
                         workunit_log_config=None):

  if not isinstance(runner, Executor.Runner):
    raise ValueError('The runner argument must be a java Executor.Runner instance, '
                     'given {} of type {}'.format(runner, type(runner)))

  if workunit_factory is None:
    return SubprocessProcessHandler(runner.spawn())
  else:
    workunit_labels = [
                        WorkUnitLabel.TOOL,
                        WorkUnitLabel.NAILGUN if isinstance(runner.executor, NailgunExecutor) else WorkUnitLabel.JVM
                      ] + (workunit_labels or [])

    workunit_generator = workunit_factory(name=workunit_name, labels=workunit_labels,
                                cmd=runner.cmd, log_config=workunit_log_config)
    workunit = workunit_generator.__enter__()
    process = runner.spawn(stdout=workunit.output('stdout'), stderr=workunit.output('stderr'))

    class WorkUnitProcessHandler(ProcessHandler):
      def wait(_):
        try:
          ret = process.wait()
          workunit.set_outcome(WorkUnit.FAILURE if ret else WorkUnit.SUCCESS)
          workunit_generator.__exit__(None, None, None)
          return ret
        except BaseException:
          if not workunit_generator.__exit__(*sys.exc_info()):
            raise

      def kill(_):
        return process.kill()

      def terminate(_):
        return process.terminate()

      def poll(_):
        return process.poll()

    return WorkUnitProcessHandler()
Delete one specified playback query. If the query is currently running, stop it.
dataset/ETHPy150Open pantsbuild/pants/src/python/pants/java/util.py/execute_runner_async--crossover with--dataset/ETHPy150Open datasift/datasift-python/datasift/historics.py/Historics.delete