class_docstr: Pushes chunks of files to our streaming endpoint.
  
  This class is used as a singleton. It has a thread that serializes access to
  the streaming endpoint and performs rate-limiting and batching.
  
  TODO: Differentiate between binary/text encoding.
code: def _read_queue(self) -> List:
      # called from the push thread (_thread_body), this does an initial read
      # that'll block for up to rate_limit_seconds. Then it tries to read
      # as much out of the queue as it can. We do this because the http post
      # to the server happens within _thread_body, and can take longer than
      # our rate limit. So next time we get a chance to read the queue we want
      # read all the stuff that queue'd up since last time.
      #
      # If we have more than MAX_ITEMS_PER_PUSH in the queue then the push thread
      # will get behind and data will buffer up in the queue.
      return util.read_many_from_queue(
          self._queue,
          self.MAX_ITEMS_PER_PUSH,
          self.rate_limit_seconds(),
      )
  
imports: import base64
  import functools
  import itertools
  import logging
  import os
  import queue
  import random
  import sys
  import threading
  import time
  from types import TracebackType
  from typing import TYPE_CHECKING, Any, Callable, Dict, List, NamedTuple, Optional, Set, Tuple, Type, Union
  import requests
  import wandb
  from wandb import util
  from wandb.sdk.internal import internal_api
  from ..lib import file_stream_utils
label_desc: Use image node_id 8 for calling the FileStreamApi obj's underlying member method code with example usage: obj._read_queue() and returns: util