docs: def stop(self):
          """
          Stops the backend process.
          """
          if self._process is None:
              return
          if self._shared:
              BackendManager.SHARE_COUNT -= 1
              if BackendManager.SHARE_COUNT:
                  return
          comm('stopping backend process')
          # close all sockets
          for s in self._sockets:
              s._callback = None
              s.close()
  
          self._sockets[:] = []
          # prevent crash logs from being written if we are busy killing
          # the process
          self._process._prevent_logs = True
          while self._process.state() != self._process.NotRunning:
              self._process.waitForFinished(1)
              if sys.platform == 'win32':
                  # Console applications on Windows that do not run an event
                  # loop, or whose event loop does not handle the WM_CLOSE
                  # message, can only be terminated by calling kill().
                  self._process.kill()
              else:
                  self._process.terminate()
          self._process._prevent_logs = False
          self._heartbeat_timer.stop()
          comm('backend process terminated')