docs: def thread_work(targets, function, params = {}, num_threads = 0):
      """
      Generic multithreading helper
  
      :param targets:
      :param function:
      :param params:
      :param num_threads:
  
      :return:
      """
      q = Queue(maxsize=0)
      if not num_threads:
          num_threads = len(targets)
      for i in range(num_threads):
          worker = Thread(target=function, args=(q, params))
          worker.setDaemon(True)
          worker.start()
      for target in targets:
          q.put(target)
      q.join()