code: func (p *Pool) purgeStalePools() error {
  	conn := redisPool.Get()
  	defer conn.Close()
  	poolIds, err := redis.Strings(conn.Do("SMEMBERS", Keys.ActivePools))
  	if err != nil {
  		return err
  	}
  	for _, poolId := range poolIds {
  		p.RLock()
  		thisId := p.id
  		p.RUnlock()
  		if poolId == thisId {
  			// Don't ping self
  			continue
  		}
  		pool := &Pool{id: poolId}
  		go func(pool *Pool) {
  			if err := p.pingAndPurgeIfNeeded(pool); err != nil {
  				// TODO: send accross an err channel instead of panicking
  				panic(err)
  			}
  		}(pool)
  	}
  	return nil
  }
docs: // purgeStalePools will first get all the ids of pools from the activePools
  // set. All of these should be active, but if Pool.Wait was never called for
  // a pool (possibly because of power failure), some of them might not actually
  // be active. To find out for sure, purgeStalePools will ping each pool that is
  // supposed to be active and wait for a pong response. If it does not receive
  // a pong within some amount of time, the pool is considered stale (i.e. whatever
  // process that was running it was exited and it is no longer executing jobs). If
  // any stale pools are found, purgeStalePools will remove them from the set of
  // active pools and then moves any jobs associated with the stale pool from the
  // executing set to the queued set to be retried.