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.
docstr: Take an argument and canonicalize it into a list for all workers.
  
  This helper function is used to handle arguments in the sampler API
  which may (optionally) be lists. Specifically, these are agent, env,
  agent_update, and env_update. Checks that the number of parameters is
  correct.
  
  Args:
      objs(object or list): Must be either a single object or a list
          of length n_workers.
      preprocess(function): Function to call on each single object before
          creating the list.
  
  Raises:
      ValueError: If a list is passed of a length other than `n_workers`.
  
  Returns:
      List[object]: A list of length self.n_workers.
docstr_tok: ["Take","an","argument","and","canonicalize","it","into","a","list","for","all","workers",".","This","helper","function","is","used","to","handle","arguments","in","the","sampler","API","which","may","(","optionally",")","be","lists",".","Specifically",",","these","are","agent",",","env",",","agent_update",",","and","env_update",".","Checks","that","the","number","of","parameters","is","correct",".","Args",":","objs","(","object","or","list",")",":","Must","be","either","a","single","object","or","a","list","of","length","n_workers",".","preprocess","(","function",")",":","Function","to","call","on","each","single","object","before","creating","the","list",".","Raises",":","ValueError",":","If","a","list","is","passed","of","a","length","other","than","`","n_workers","`",".","Returns",":","List","[","object","]",":","A","list","of","length","self.n_workers","."]
code: def prepare_worker_messages(self, objs, preprocess=identity_function):
      """Take an argument and canonicalize it into a list for all workers.
  
      This helper function is used to handle arguments in the sampler API
      which may (optionally) be lists. Specifically, these are agent, env,
      agent_update, and env_update. Checks that the number of parameters is
      correct.
  
      Args:
          objs(object or list): Must be either a single object or a list
              of length n_workers.
          preprocess(function): Function to call on each single object before
              creating the list.
  
      Raises:
          ValueError: If a list is passed of a length other than `n_workers`.
  
      Returns:
          List[object]: A list of length self.n_workers.
  
      """
      if isinstance(objs, list):
          if len(objs) != self.n_workers:
              raise ValueError(
                  "Length of list doesn't match number of workers"
              )
          return [preprocess(obj) for obj in objs]
      else:
          return [preprocess(objs) for _ in range(self.n_workers)]
  
imports: import psutil
  from garage.experiment.deterministic import get_seed
  from garage.sampler.default_worker import DefaultWorker
label_desc: Use image node_id 2 for calling the WorkerFactory obj's underlying member method code with example usage: obj.prepare_worker_messages(objs, preprocess) and returns: unknown, unknown