code: def _update_band_usage(
      self, band: BandType, band_usage_delta: Resource
  ):
      self._band_used_resources[band] += band_usage_delta
      # some code path doesn't call `apply_subtask_resources`
      band_total_resource = self._band_total_resources.get(band)
      if (
          band_total_resource is not None
          and self._band_used_resources[band] > band_total_resource
      ):  # pragma: no cover
          raise Exception(
              f"Resource exceed: band used resource {self._band_used_resources[band]} "
              f"band total resource {self._band_total_resources[band]}"
          )
      if self._band_used_resources[band] <= ZeroResource:
          self._band_used_resources.pop(band)
          self._band_idle_start_time[band] = time.time()
          if band in self._band_idle_events:
              self._band_idle_events.pop(band).set()
      else:
          self._band_idle_start_time[band] = -1
  
file_path: mars/mars/services/scheduling/supervisor/globalresource.py
imports: import asyncio
  import logging
  import time
  from collections import defaultdict
  from typing import List, DefaultDict, Dict, Tuple
  from ....None import oscar
  from ....resource import Resource, ZeroResource
  from ....typing import BandType
label_desc: Use image node_id 4 for calling the GlobalResourceManagerActor obj's underlying member method code with example usage: obj._update_band_usage(band, band_usage_delta) without return types