code: def run_modules(self):
      
  
      def _run_module_thread(module_description):
        """Runs the module's process() function.
  
        Waits for any blockers to have finished before running process(), then
        sets an Event flag declaring the module has completed.
        """
        for blocker in module_description['wants']:
          self.events[blocker].wait()
        module = self._module_pool[module_description['name']]
        try:
          module.process()
        except DFTimewolfError as error:
          self.add_error(error.message, critical=True)
        except Exception as error:  # pylint: disable=broad-except
          self.add_error(
              'An unknown error occurred: {0!s}\nFull traceback:\n{1:s}'.format(
                  error, traceback.format_exc()),
              critical=True)
        print('Module {0:s} completed'.format(module_description['name']))
        self.events[module_description['name']].set()
        self.cleanup()
  
      threads = []
      for module_description in self.recipe['modules']:
        t = threading.Thread(
            target=_run_module_thread,
            args=(module_description, )
        )
        threads.append(t)
        t.start()
      for t in threads:
        t.join()
  
      self.check_errors(is_global=True)
docs: Performs the actual processing for each module in the module pool.