class_docstr: Constructs workers for Samplers.
  
  The intent is that this object should be sufficient to avoid subclassing
  the sampler. Instead of subclassing the sampler for e.g. a specific
  backend, implement a specialized WorkerFactory (or specify appropriate
  functions to this one). Not that this object must be picklable, since it
  may be passed to workers. However, its fields individually need not be.
  
  All arguments to this type must be passed by keyword.
  
  Args:
      max_episode_length(int): The maximum length episodes which will be
          sampled.
      is_tf_worker (bool): Whether it is workers for TFTrainer.
      seed(int): The seed to use to initialize random number generators.
      n_workers(int): The number of workers to use.
      worker_class(type): Class of the workers. Instances should implement
          the Worker interface.
      worker_args (dict or None): Additional arguments that should be passed
          to the worker.
code: def __init__(
      self,
      *,  # Require passing by keyword.
      max_episode_length,
      is_tf_worker=False,
      seed=get_seed(),
      n_workers=psutil.cpu_count(logical=False),
      worker_class=DefaultWorker,
      worker_args=None,
  ):
      self.n_workers = n_workers
      self._seed = seed
      self._max_episode_length = max_episode_length
      if is_tf_worker:
          # Import here to avoid hard dependency on TF.
          # pylint: disable=import-outside-toplevel
          from garage.tf.samplers import TFWorkerClassWrapper
  
          worker_class = TFWorkerClassWrapper(worker_class)
      self._worker_class = worker_class
      if worker_args is None:
          self._worker_args = {}
      else:
          self._worker_args = worker_args
  
imports: import psutil
  from garage.experiment.deterministic import get_seed
  from garage.sampler.default_worker import DefaultWorker
label_desc: Use image node_id 1 to create a new WorkerFactory object  with example: obj = WorkerFactory()