code: def __init__(
      self, session_id: str, submit_period: Union[float, int] = None
  ):
      self._session_id = session_id
      self._stid_to_bands = defaultdict(list)
      self._stid_to_items = dict()
      # Note that we need to ensure top item in every band heap queue is valid,
      # so that we can ensure band queue is busy if the band queue is not empty.
      self._band_queues = defaultdict(list)
  
      self._cluster_api = None
      self._slots_ref = None
      self._assigner_ref = None
  
      self._band_to_resource = dict()
      self._band_watch_task = None
      self._max_enqueue_id = 0
  
      self._periodical_submit_task = None
      self._submit_period = submit_period or _DEFAULT_SUBMIT_PERIOD
      self._submitted_subtask_number = Metrics.gauge(
          "mars.band.submitted_subtask_number",
          "The number of submitted subtask to a band.",
          ("session_id", "band"),
      )
      self._unsubmitted_subtask_number = Metrics.gauge(
          "mars.band.unsubmitted_subtask_number",
          "The number of unsubmitted subtask to a band.",
          ("session_id", "band"),
      )
  
imports: import asyncio
  import copy
  import heapq
  import logging
  from collections import defaultdict
  from dataclasses import dataclass
  from typing import DefaultDict, Dict, List, Optional, Tuple, Union, Set
  from ....None import oscar
  from ....lib.aio import alru_cache
  from ....metrics import Metrics
  from ....resource import ZeroResource
  from ....utils import dataslots
  from ...subtask import Subtask
  from ...task import TaskAPI
  from ..utils import redirect_subtask_errors
label_desc: Use image node_id 2 to create a new SubtaskQueueingActor object from inherited base classes: mo with example: obj = SubtaskQueueingActor(session_id, submit_period)