class_docstr: A worker manager which spawns a new thread for each worker. 
docstr: Dispatches experiment to worker_id. 
docstr_tok: ["Dispatches","experiment","to","worker_id","."]
code: def _dispatch_experiment(
      self, func_caller, qinfo, worker_id, **kwargs
  ):
      """Dispatches experiment to worker_id."""
      # pylint: disable=star-args
      if self.qinfos_in_progress[worker_id] is not None:
          err_msg = "qinfos_in_progress: %s,\nfree_workers: %s." % (
              str(self.qinfos_in_progress),
              str(self.free_workers),
          )
          print(err_msg)
          raise ValueError(
              "Check if worker is free before sending experiment."
          )
      # First add all the data to qinfo
      qinfo.worker_id = worker_id
      qinfo.working_dir = self.working_dir_names[worker_id]
      qinfo.result_file = self._get_result_file_name_for_worker(
          worker_id
      )
      # Create the working directory
      os.makedirs(qinfo.working_dir)
      # Dispatch the experiment in a new process
      target_func = lambda: func_caller.eval_from_qinfo(qinfo, **kwargs)
      self.worker_processes[worker_id] = Process(target=target_func)
      self.worker_processes[worker_id].start()
      time.sleep(self.sleep_time_after_new_process)
      # Add the qinfo to the in progress bar and remove from free_workers
      self.qinfos_in_progress[worker_id] = qinfo
      self.func_callers_for_each_worker[worker_id] = func_caller
      self.free_workers.discard(worker_id)
  
imports: from __future__ import print_function
  from __future__ import division
  from argparse import Namespace
  from multiprocessing import Process
  import numpy
  import os
  import pickle
  import shutil
  import time
  from .exd_utils import EVAL_ERROR_CODE
label_desc: Use image node_id 13 for calling the MultiProcessingWorkerManager obj's underlying member method code with example usage: obj._dispatch_experiment(func_caller, qinfo, worker_id) without return types