docs: def emit(self, key, value):
          """\
          Handle an output key/value pair.
  
          Reporting progress is strictly necessary only when using a Python
          record writer, because sending an output key/value pair is an implicit
          progress report. To take advantage of this, however, we would be
          forced to flush the uplink stream at every output, and that would be
          too costly. Rather than add a specific timer for this, we just call
          progress unconditionally and piggyback on its timer instead. Note that
          when a combiner is caching there is no actual output, so in that case
          we would need an explicit progress report anyway.
          """
          if self.__spilling:
              self.__actual_emit(key, value)
          else:
              # key must be hashable
              self.__cache.setdefault(key, []).append(value)
              self.__cache_size += sizeof(key) + sizeof(value)
              if self.__cache_size >= self.__spill_size:
                  self.__spill_all()
          self.progress()