class_docstr: Coordinator actor for routing blocks to output splits.
  
  This actor runs a streaming executor locally on its main thread. Clients can
  retrieve results via actor calls running on other threads.
class_docstr_tok: ["Coordinator","actor","for","routing","blocks","to","output","splits",".","This","actor","runs","a","streaming","executor","locally","on","its","main","thread",".","Clients","can","retrieve","results","via","actor","calls","running","on","other","threads","."]
docstr: Called to start an epoch.
  
  Returns:
      UUID for the epoch, which must be used when accessing results via get().
docstr_tok: ["Called","to","start","an","epoch",".","Returns",":","UUID","for","the","epoch",",","which","must","be","used","when","accessing","results","via","get","(",")","."]
code: def start_epoch(self, split_idx: int) -> str:
      """Called to start an epoch.
  
      Returns:
          UUID for the epoch, which must be used when accessing results via get().
      """
  
      # Wait for all clients to arrive at the barrier before starting a new epoch.
      epoch_id = self._barrier(split_idx)
      return epoch_id
  
imports: import copy
  import logging
  import threading
  import time
  from dataclasses import replace
  from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Tuple, Union
  import ray
  from ray.data._internal.execution.interfaces import NodeIdStr, RefBundle
  from ray.data._internal.execution.legacy_compat import execute_to_legacy_bundle_iterator
  from ray.data._internal.execution.operators.output_splitter import OutputSplitter
  from ray.data._internal.execution.streaming_executor import StreamingExecutor
  from ray.data._internal.stats import DatasetStats, DatasetStatsSummary
  from ray.data._internal.util import create_dataset_tag
  from ray.data.block import Block, BlockMetadata
  from ray.data.iterator import DataIterator
  from ray.types import ObjectRef
  from ray.util.debug import log_once
  from ray.util.scheduling_strategies import NodeAffinitySchedulingStrategy
label_desc: Use image node_id 3 for calling the SplitCoordinator obj's underlying member method code with example usage: obj.start_epoch(split_idx) and returns: epoch_id