          processes = mp.cpu_count()
      method = method_to_run
      pool = mp.Pool(processes=processes)
  
      for i in pool.imap_unordered(runner, data):
          yield i if i is not None else 0
      
  def runner(item):
      return method(item)
 
</s> remove def pool_process(method_to_run, data, processes=None):
    global method
    if processes is None:
        processes = mp.cpu_count()
    method = method_to_run
    pool = mp.Pool(processes=processes)
 </s> add     def run(self):
        """ Put until queue size is reached.
            Note: put blocks only if put is called while queue has already
            reached max size => this makes 2 prefetched items! One in the
            queue, one waiting for insertion! """
        for item in self.generator:
            self.queue.put(item)
        self.queue.put(None) </s> remove method = None
 </s> add class BackgroundGenerator(threading.Thread):
    """ Run a queue in the background. From:
        https://stackoverflow.com/questions/7323664/ """
    # See below why prefetch count is flawed
    def __init__(self, generator, prefetch=1):
        threading.Thread.__init__(self)
        self.queue = Queue.Queue(maxsize=prefetch)
        self.generator = generator
        self.daemon = True
        self.start() </s> remove def Enable_CUDA():
 </s> add def ask_enable_cuda():
    """ Enable or disable CUDA """ </s> remove     if i == "" or i == "Y" or i == "y":
        INFO("Docker Enabled")
 </s> add     if i in ("", "Y", "y"):
        out_info("Docker Enabled") </s> remove     if i == "" or i == "Y" or i == "y":
        INFO("CUDA Enabled")
 </s> add     if i in ("", "Y", "y"):
        out_info("CUDA Enabled")
    def iterator(self):
        """ Iterate items out of the queue """
        while True:
            next_item = self.queue.get()
            if next_item is None:
                break
            yield next_item
          processes = mp.cpu_count()
      method = method_to_run
      pool = mp.Pool(processes=processes)
  
    def iterator(self):
        """ Iterate items out of the queue """
        while True:
            next_item = self.queue.get()
            if next_item is None:
                break
            yield next_item
    def iterator(self):
        """ Iterate items out of the queue """
        while True:
            next_item = self.queue.get()
            if next_item is None:
                break
            yield next_item
    def iterator(self):
        """ Iterate items out of the queue """
        while True:
            next_item = self.queue.get()
            if next_item is None:
                break
            yield next_item
    def iterator(self):
        """ Iterate items out of the queue """
        while True:
            next_item = self.queue.get()
            if next_item is None:
                break
            yield next_item
    def iterator(self):
        """ Iterate items out of the queue """
        while True:
            next_item = self.queue.get()
            if next_item is None:
                break
            yield next_item
keep keep keep keep replace replace replace replace replace
 Extraction - Speed improvements (#522) (#523)

* Extraction - Speed improvements (#522)

* Initial Plugin restructure

* Detectors to plugins. Detector speed improvements

* Re-implement dlib aligner, remove models, FAN to TF. Parallel processing

* Update manual, update convert, implement parallel/serial switching

* linting + fix cuda check (setup.py). requirements update keras 2.2.4

* Add extract size option. Fix dlib hog init

* GUI: Increase tooltip width

* Update alignment tool to support new DetectedFace

* Add skip existing faces option

* Fix sort tool to new plugin structure

* remove old align plugin

* fix convert -skip faces bug

* Fix convert skipping no faces frames

* Convert - draw onto transparent layer

* Fix blur threshold bug

* fix skip_faces convert bug

* Fix training 
lib/multithreading.py