code: def _StopExtractionProcesses(self, abort=False):
      
      logger.debug('Stopping extraction 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()
  
      logger.debug('Emptying task queue.')
      self._task_queue.Empty()
  
      # Wake the processes to make sure that they are not blocking
      # waiting for the queue new items.
      for _ in self._processes_per_pid:
        try:
          self._task_queue.PushItem(plaso_queue.QueueAbort(), block=False)
        except errors.QueueFull:
          logger.warning('Task queue full, unable to push abort message.')
  
      # Try waiting for the processes to exit normally.
      self._AbortJoin(timeout=self._PROCESS_JOIN_TIMEOUT)
      self._task_queue.Close(abort=abort)
  
      if not abort:
        # Check if the processes are still alive and terminate them if necessary.
        self._AbortTerminate()
        self._AbortJoin(timeout=self._PROCESS_JOIN_TIMEOUT)
        self._task_queue.Close(abort=True)
  
      # Kill any lingering processes.
      self._AbortKill()
docs: Stops the extraction processes.
  
      Args:
        abort (bool): True to indicated the stop is issued on abort.