docs: def kill_all(self):
          '''Kill all workers'''
          while self._num_workers > 0 and self._worker_backend_socket.poll(1000):
              msg = self._worker_backend_socket.recv_pyobj()
              self._worker_backend_socket.send_pyobj(None)
              self._num_workers -= 1
              self.report(f'Kill {msg[1:]}')
          # join all processes
          [worker.join() for worker in self._workers]