docs: def fetch_messages(self):
          """Fetch messages from the specified pull-queue.
  
          This should only be called a single time by a given MessageIterator
          object.  If the MessageIterator is iterated over again, it should
          return the originally leased messages.
          """
          if self._fetched:
              return
  
          start = time.time()
  
          loaded_messages = self.queue.lease_tasks_by_tag(
              self.duration, self.size, tag=self.tag, deadline=self.deadline)
  
          # If we are within 0.1 sec of our deadline and no messages were
          # returned, then we are hitting queue contention issues and this
          # should be a DeadlineExceederError.
          # TODO: investigate other ways around this, perhaps async leases, etc.
          if (not loaded_messages and
                  round(time.time() - start, 1) >= self.deadline - 0.1):
              raise DeadlineExceededError()
  
          self._messages.extend(loaded_messages)
  
          self._fetched = True
  
          logging.debug("Calling fetch messages with %s:%s:%s:%s:%s:%s" % (
              len(self._messages), len(loaded_messages),
              len(self._processed_messages), self.duration, self.size, self.tag))