code: func (c *autoRegisterController) Run(threadiness int, stopCh <-chan struct{}) {
  	// don't let panics crash the process
  	defer utilruntime.HandleCrash()
  	// make sure the work queue is shutdown which will trigger workers to end
  	defer c.queue.ShutDown()
  
  	klog.Infof("Starting autoregister controller")
  	defer klog.Infof("Shutting down autoregister controller")
  
  	// wait for your secondary caches to fill before starting your work
  	if !controllers.WaitForCacheSync("autoregister", stopCh, c.apiServiceSynced) {
  		return
  	}
  
  	// record APIService objects that existed when we started
  	if services, err := c.apiServiceLister.List(labels.Everything()); err == nil {
  		for _, service := range services {
  			c.apiServicesAtStart[service.Name] = true
  		}
  	}
  
  	// start up your worker threads based on threadiness.  Some controllers have multiple kinds of workers
  	for i := 0; i < threadiness; i++ {
  		// runWorker will loop until "something bad" happens.  The .Until will then rekick the worker
  		// after one second
  		go wait.Until(c.runWorker, time.Second, stopCh)
  	}
  
  	// wait until we're told to stop
  	<-stopCh
  }
docs: // Run starts the autoregister controller in a loop which syncs API services until stopCh is closed.