code: func (p *Pool) Start() error {
  	// Purge stale jobs belonging to this pool if there was a recent
  	// hard failure
  	if err := p.removeStaleSelf(); err != nil {
  		return err
  	}
  
  	// Check on the status of other worker pools by pinging them and
  	// start the process to repond to pings from other pools
  	if err := p.addToPoolSet(); err != nil {
  		return err
  	}
  	go func() {
  		select {
  		case <-p.exit:
  			return
  		default:
  		}
  		if err := p.respondToPings(); err != nil {
  			// TODO: send the err accross a channel instead of panicking
  			panic(err)
  		}
  	}()
  	if err := p.purgeStalePools(); err != nil {
  		return err
  	}
  
  	// Initialize workers
  	for i := range p.workers {
  		p.wg.Add(1)
  		worker := &worker{
  			wg:        p.wg,
  			jobs:      p.jobs,
  			afterFunc: p.afterFunc,
  		}
  		p.workers[i] = worker
  		worker.start()
  	}
  	go func() {
  		if err := p.queryLoop(); err != nil {
  			// TODO: send the err accross a channel instead of panicking
  			panic(err)
  		}
  	}()
  	return nil
  }
docs: // Start starts the worker pool. This means the pool will initialize workers,
  // continuously query the database for queued jobs, and delegate those jobs
  // to the workers.