pool.shutdown() should run self._kill() for all resources in the pool. However, _kill() is only ever run for the first client in self.resources. Best guess: self.resources.forEach(...) doesn't like that removePoolObject() is re-splicing the list?