'Return a dict summarizing the threads in the pool (as
described in the ThreadPool docstring).'

def track_threads(self):

    result = dict(idle=[], busy=[], hung=[], dying=[], zombie=[])
    now = time.time()
    for worker in self.workers:
        if (not hasattr(worker, 'thread_id')):
            continue
        (time_started, info) = self.worker_tracker.get(worker.thread_id, (None, None))
        if (time_started is not None):
            if ((now - time_started) > self.hung_thread_limit):
                result['hung'].append(worker)
            else:
                result['busy'].append(worker)
        else:
            result['idle'].append(worker)
    for (thread_id, (time_killed, worker)) in self.dying_threads.items():
        if (not self.thread_exists(thread_id)):
            self.logger.info('Killed    thread    %s    no    longer    around', thread_id)
            try:
                del self.dying_threads[thread_id]
            except KeyError:
                pass
            continue
        if ((now - time_killed) > self.dying_limit):
            result['zombie'].append(worker)
        else:
            result['dying'].append(worker)
    return result
