code: def wait(self, timeout=None, poll_interval=5, verbose=False):
      if not self.async_accepted:
          return self
      session = self.__session
      poll_interval = max(1, poll_interval)
      remaining = max(0, timeout) if timeout else sys.maxsize
      while remaining > 0:
          if not self.ready():
              # Still pending, log and continue
              if verbose and session._logger:
                  progress = (
                      "waiting forever"
                      if timeout is False
                      else "%.1f/%.1f seconds remaining"
                      % (remaining, float(timeout or 0))
                  )
                  session._logger.info(
                      "Waiting for asynchronous call %s (%s)"
                      % (self.request_cls.__name__, progress)
                  )
              time.sleep(poll_interval)
              remaining -= poll_interval
              continue
          # We've got something (good or bad, we don't know), create a call result and return
          return self.result()
  
      # Timeout expired, return the asynchronous call's result (we've got nothing better to report)
      raise TimeoutExpiredError(
          self._format_msg("Timeout expired"), call_id=self.meta.id
      )
  
file_path: clearml/clearml/backend_api/session/callresult.py
imports: import sys
  import time
  from ...backend_api.utils import get_response_cls
  from .response import ResponseMeta, Response
  from .errors import ResultNotReadyError, TimeoutExpiredError
label_desc: Use image node_id 12 for calling the CallResult obj's underlying member method code with example usage: obj.wait(timeout, poll_interval, verbose) and returns: self, self