class_docstr: Runner for locally distributed training, based on SubprocVectorEnv.
docstr: create multi-process env distribution
docstr_tok: ["create","multi-process","env","distribution"]
code: def create_distributed_env(
      self,
      env_factory: Callable[[], Union[MazeEnv, StructuredEnv]],
      concurrency: int,
      logging_prefix: str,
  ) -> SubprocVectorEnv:
      """create multi-process env distribution"""
      return SubprocVectorEnv(
          [env_factory for _ in range(concurrency)],
          logging_prefix=logging_prefix,
      )
  
imports: import dataclasses
  from abc import abstractmethod
  from typing import Callable, Union
  from maze.train.trainers.common.evaluators.rollout_evaluator import RolloutEvaluator
  from omegaconf import DictConfig
  from maze.core.agent.torch_actor_critic import TorchActorCritic
  from maze.core.annotations import override
  from maze.core.env.maze_env import MazeEnv
  from maze.core.env.structured_env import StructuredEnv
  from maze.core.rollout.rollout_generator import RolloutGenerator
  from maze.core.utils.factory import Factory
  from maze.train.parallelization.vector_env.sequential_vector_env import SequentialVectorEnv
  from maze.train.parallelization.vector_env.structured_vector_env import StructuredVectorEnv
  from maze.train.parallelization.vector_env.subproc_vector_env import SubprocVectorEnv
  from maze.train.trainers.common.actor_critic.actor_critic_trainer import ActorCritic
  from maze.train.trainers.common.model_selection.best_model_selection import BestModelSelection
  from maze.train.trainers.common.training_runner import TrainingRunner
  from maze.utils.process import query_cpu
label_desc: Use image node_id 1 for calling the ACLocalRunner obj's underlying member method code with example usage: obj.create_distributed_env(env_factory, concurrency, logging_prefix) and returns: SubprocVectorEnv