code: def _thread_main(self):
          
          quit_ = False
  
          while True:
              items = self._get_items()
              data = []
  
              for item in items:
                  if item is _WORKER_TERMINATOR:
                      quit_ = True
                      # Continue processing items, don't break, try to process
                      # all items we got back before quitting.
                  else:
                      data.extend(item)
  
              if data:
                  try:
                      self.exporter.emit(data)
                  except Exception:
                      logging.exception(
                          '%s failed to emit data.'
                          'Dropping %s objects from queue.',
                          self.exporter.__class__.__name__,
                          len(data))
                      pass
  
              for _ in range(len(items)):
                  self._queue.task_done()
  
              # self._event is set at exit, at which point we start draining the
              # queue immediately. If self._event is unset, block for
              # self.wait_period between each batch of exports.
              self._event.wait(self._wait_period)
  
              if quit_:
                  break
docs: The entry point for the worker thread.
  
          Pulls pending data off the queue and writes them in
          batches to the specified tracing backend using the exporter.