docstr: Shutdown the data channel
code: def _shutdown(self) -> None:
      """
      Shutdown the data channel
      """
      with self.lock:
          self._in_shutdown = True
          self.cv.notify_all()
  
          callbacks = self.asyncio_waiting_data.values()
          self.asyncio_waiting_data = {}
  
      if self._last_exception:
          # Abort async requests with the error.
          err = ConnectionError(
              "Failed during this or a previous request. Exception that "
              f"broke the connection: {self._last_exception}"
          )
      else:
          err = ConnectionError(
              "Request cannot be fulfilled because the data client has "
              "disconnected."
          )
      for callback in callbacks:
          if callback:
              callback(err)
  
imports: import math
  import logging
  import queue
  import threading
  import warnings
  import grpc
  from collections import OrderedDict
  from typing import Any, Callable, Dict, TYPE_CHECKING, Optional, Union
  import ray.core.generated.ray_client_pb2
  import ray.core.generated.ray_client_pb2_grpc
  from ray.util.client.common import INT32_MAX, OBJECT_TRANSFER_CHUNK_SIZE, OBJECT_TRANSFER_WARNING_SIZE
  from ray.util.debug import log_once
label_desc: Use image node_id 8 for calling the DataClient obj's underlying member method code with example usage: obj._shutdown() without return types