code: def _shrink(self, needed, running):
          
          log = self._params.get('log', self._discard)
          log.info("%d process%s running, reducing to %d process%s", running, ses(running, 'es'), needed, ses(needed, 'es'))
          now = time.time()
          signalled = 0
          for proc in self._proc_state[needed:]:
              if proc.pid is None:
                  continue
              if proc.pending_sig is None:
                  proc.pending_sig = signal.SIGTERM
              if proc.next_sig is None or proc.next_sig < now:
                  self._signal(proc.pending_sig, pid=proc.pid)
                  signalled += 1
                  proc.pending_sig = signal.SIGKILL
                  proc.next_sig = now + sigkill_escalation
              else:
                  log.debug("Process instance %d (pid %d) for task '%s' exit pending",
                          proc.instance, proc.pid, self._name)
          log.info("%d process%s signalled", signalled, ses(signalled, 'es'))
docs: Shrink the process pool from the number currently running to
          the needed number.  The processes will be sent a SIGTERM at first
          and if that doesn't clear the process, a SIGKILL.  Errors will
          be logged but otherwise ignored.