code: def _StopAnalysisProcesses(self, abort=False):
      
      logger.debug('Stopping analysis processes.')
      self._StopMonitoringProcesses()
  
      # Note that multiprocessing.Queue is very sensitive regarding
      # blocking on either a get or a put. So we try to prevent using
      # any blocking behavior.
  
      if abort:
        # Signal all the processes to abort.
        self._AbortTerminate()
  
      if not self._use_zeromq:
        logger.debug('Emptying queues.')
        for event_queue in self._event_queues.values():
          event_queue.Empty()
  
      # Wake the processes to make sure that they are not blocking
      # waiting for the queue new items.
      for event_queue in self._event_queues.values():
        event_queue.PushItem(plaso_queue.QueueAbort(), block=False)
  
      # Try waiting for the processes to exit normally.
      self._AbortJoin(timeout=self._PROCESS_JOIN_TIMEOUT)
      for event_queue in self._event_queues.values():
        event_queue.Close(abort=abort)
  
      if abort:
        # Kill any remaining processes.
        self._AbortKill()
      else:
        # Check if the processes are still alive and terminate them if necessary.
        self._AbortTerminate()
        self._AbortJoin(timeout=self._PROCESS_JOIN_TIMEOUT)
  
        for event_queue in self._event_queues.values():
          event_queue.Close(abort=True)
docs: Stops the analysis processes.
  
      Args:
        abort (bool): True to indicated the stop is issued on abort.