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_eval_env(
      cls,
      env_factory: Callable[
          [], Union[StructuredEnv, StructuredEnvSpacesMixin]
      ],
      eval_concurrency: int,
      logging_prefix: str,
  ) -> SubprocVectorEnv:
      """create multi-process env distribution"""
      return SubprocVectorEnv(
          [env_factory for _ in range(eval_concurrency)],
          logging_prefix=logging_prefix,
      )
  
imports: import dataclasses
  from abc import abstractmethod
  from typing import Tuple, Callable, Union, Optional, List
  import numpy
  import torch
  from omegaconf import DictConfig
  from torch.optim.optimizer import Optimizer
  from torch.utils.data.dataloader import DataLoader
  from torch.utils.data.dataset import Dataset, Subset
  from maze.core.agent.torch_policy import TorchPolicy
  from maze.core.annotations import override
  from maze.core.env.structured_env import StructuredEnv
  from maze.core.env.structured_env_spaces_mixin import StructuredEnvSpacesMixin
  from maze.core.utils.config_utils import SwitchWorkingDirectoryToInput
  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.evaluators.evaluator import Evaluator
  from maze.train.trainers.common.evaluators.multi_evaluator import MultiEvaluator
  from maze.train.trainers.common.evaluators.rollout_evaluator import RolloutEvaluator
  from maze.train.trainers.common.model_selection.best_model_selection import BestModelSelection
  from maze.train.trainers.common.training_runner import TrainingRunner
  from maze.train.trainers.imitation.bc_loss import BCLoss
  from maze.train.trainers.imitation.bc_trainer import BCTrainer
  from maze.train.trainers.imitation.bc_validation_evaluator import BCValidationEvaluator
  from maze.utils.bcolors import BColors
  from maze.utils.get_size_of_objects import getsize
  from maze.utils.process import query_cpu
label_desc: Use image node_id 1 for calling the BCLocalRunner obj's underlying member method code with example usage: obj.create_distributed_eval_env(cls, env_factory, eval_concurrency, logging_prefix) and returns: SubprocVectorEnv