code: func (tc *NoExecuteTaintManager) Run(stopCh <-chan struct{}) {
  	klog.V(0).Infof("Starting NoExecuteTaintManager")
  
  	for i := 0; i < UpdateWorkerSize; i++ {
  		tc.nodeUpdateChannels = append(tc.nodeUpdateChannels, make(chan nodeUpdateItem, NodeUpdateChannelSize))
  		tc.podUpdateChannels = append(tc.podUpdateChannels, make(chan podUpdateItem, podUpdateChannelSize))
  	}
  
  	// Functions that are responsible for taking work items out of the workqueues and putting them
  	// into channels.
  	go func(stopCh <-chan struct{}) {
  		for {
  			item, shutdown := tc.nodeUpdateQueue.Get()
  			if shutdown {
  				break
  			}
  			nodeUpdate := item.(nodeUpdateItem)
  			hash := hash(nodeUpdate.nodeName, UpdateWorkerSize)
  			select {
  			case <-stopCh:
  				tc.nodeUpdateQueue.Done(item)
  				return
  			case tc.nodeUpdateChannels[hash] <- nodeUpdate:
  				// tc.nodeUpdateQueue.Done is called by the nodeUpdateChannels worker
  			}
  		}
  	}(stopCh)
  
  	go func(stopCh <-chan struct{}) {
  		for {
  			item, shutdown := tc.podUpdateQueue.Get()
  			if shutdown {
  				break
  			}
  			podUpdate := item.(podUpdateItem)
  			hash := hash(podUpdate.nodeName, UpdateWorkerSize)
  			select {
  			case <-stopCh:
  				tc.podUpdateQueue.Done(item)
  				return
  			case tc.podUpdateChannels[hash] <- podUpdate:
  				// tc.podUpdateQueue.Done is called by the podUpdateChannels worker
  			}
  		}
  	}(stopCh)
  
  	wg := sync.WaitGroup{}
  	wg.Add(UpdateWorkerSize)
  	for i := 0; i < UpdateWorkerSize; i++ {
  		go tc.worker(i, wg.Done, stopCh)
  	}
  	wg.Wait()
  }
docs: // Run starts NoExecuteTaintManager which will run in loop until `stopCh` is closed.