class_docstr: Runner for single-threaded training, based on SequentialVectorEnv.
docstr: create single-threaded env distribution
docstr_tok: ["create","single-threaded","env","distribution"]
code: def create_distributed_eval_env(
      self,
      env_factory: Callable[[], MazeEnv],
      eval_concurrency: int,
      logging_prefix: str,
  ) -> SequentialVectorEnv:
      """create single-threaded env distribution"""
      # fallback to a fixed number of pseudo-concurrent environments to avoid making this sequential execution
      # unnecessary slow on machines with a higher core number
      return SequentialVectorEnv(
          [env_factory for _ in range(eval_concurrency)],
          logging_prefix=logging_prefix,
      )
  
imports: import copy
  from abc import abstractmethod
  from dataclasses import dataclass
  from typing import Callable, List, Union
  from omegaconf import DictConfig
  from torch.utils.data import Dataset
  from maze.core.agent.policy import Policy
  from maze.core.agent.torch_actor_critic import TorchActorCritic
  from maze.core.agent.torch_policy import TorchPolicy
  from maze.core.agent.torch_state_action_critic import TorchStateActionCritic
  from maze.core.annotations import override
  from maze.core.env.maze_env import MazeEnv
  from maze.core.log_stats.log_stats import LogStatsAggregator, LogStatsLevel, get_stats_logger
  from maze.core.rollout.rollout_generator import RolloutGenerator
  from maze.core.trajectory_recording.datasets.in_memory_dataset import InMemoryDataset
  from maze.core.trajectory_recording.records.trajectory_record import SpacesTrajectoryRecord
  from maze.core.utils.config_utils import SwitchWorkingDirectoryToInput
  from maze.core.utils.factory import Factory
  from maze.train.parallelization.distributed_actors.base_distributed_workers_with_buffer import BaseDistributedWorkersWithBuffer
  from maze.train.parallelization.distributed_actors.dummy_distributed_workers_with_buffer import DummyDistributedWorkersWithBuffer
  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.trainers.common.evaluators.rollout_evaluator import RolloutEvaluator
  from maze.train.trainers.common.model_selection.best_model_selection import BestModelSelection
  from maze.train.trainers.common.replay_buffer.replay_buffer import BaseReplayBuffer
  from maze.train.trainers.common.replay_buffer.uniform_replay_buffer import UniformReplayBuffer
  from maze.train.trainers.common.training_runner import TrainingRunner
  from maze.train.trainers.sac.sac_trainer import SAC
  from maze.utils.process import query_cpu
label_desc: Use image node_id 2 for calling the SACDevRunner obj's underlying member method code with example usage: obj.create_distributed_eval_env(env_factory, eval_concurrency, logging_prefix) and returns: SequentialVectorEnv