Send data to the next tier(s).  This call can be delayed if the
        coordinator thinks the backlog is too high for any of the emit
        destinations.  Likewise when buffering emit values prior to enqueuing
        them we ask the coordinator if we should flush the buffer each time in
        case the coordinator is managing the buffering by other metrics such
        as latency.

def emit(self, *args):
        """ Send data to the next tier(s).  This call can be delayed if the
        coordinator thinks the backlog is too high for any of the emit
        destinations.  Likewise when buffering emit values prior to enqueuing
        them we ask the coordinator if we should flush the buffer each time in
        case the coordinator is managing the buffering by other metrics such
        as latency. """
        if self.buffer is not None:
            self.buffer.extend(args)
            if self.buffer_max_size is not None:
                flush = len(self.buffer) >= self.buffer_max_size
            else:
                flush = yield from self.cell.coord.flush(self)
            if flush:
                yield from self.flush()
        else:
            for t in self.dests:
                yield from t.enqueue_task(self, *args)