code: def manage_crawlers(self):
          
          sites = self.json.get_site_objects()
          for index, site in enumerate(sites):
              if "daemonize" in site:
                  self.daemon_list.add_daemon(index, site["daemonize"])
              elif "additional_rss_daemon" in site:
                  self.daemon_list.add_daemon(index,
                                              site["additional_rss_daemon"])
                  self.crawler_list.append_item(index)
              else:
                  self.crawler_list.append_item(index)
  
          num_threads = self.cfg.section('Crawler')[
              'number_of_parallel_crawlers']
          if self.crawler_list.len() < num_threads:
              num_threads = self.crawler_list.len()
  
          for _ in range(num_threads):
              thread = threading.Thread(target=self.manage_crawler,
                                        args=(),
                                        kwargs={})
              self.threads.append(thread)
              thread.start()
  
          num_daemons = self.cfg.section('Crawler')['number_of_parallel_daemons']
          if self.daemon_list.len() < num_daemons:
              num_daemons = self.daemon_list.len()
  
          for _ in range(num_daemons):
              thread_daemonized = threading.Thread(target=self.manage_daemon,
                                                   args=(),
                                                   kwargs={})
              self.threads_daemonized.append(thread_daemonized)
              thread_daemonized.start()
  
          while not self.shutdown:
              try:
                  time.sleep(10)
                  # if we are not in daemon mode and no crawler is running any longer,
                  # all articles have been crawled and the tool can shut down
                  if self.daemon_list.len() == 0 and self.number_of_active_crawlers == 0:
                      self.graceful_stop()
                      break
  
              except IOError:
                  # This exception will only occur on kill-process on windows.
                  # The process should be killed, thus this exception is
                  # irrelevant.
                  pass
docs: Manages all crawlers, threads and limites the number of parallel
          running threads.