diff --git a/src/pocketmine/MemoryManager.php b/src/pocketmine/MemoryManager.php index 38f56ec47..34cc31f52 100644 --- a/src/pocketmine/MemoryManager.php +++ b/src/pocketmine/MemoryManager.php @@ -243,6 +243,9 @@ class MemoryManager{ if($this->garbageCollectionAsync){ $pool = $this->server->getAsyncPool(); + if(($w = $pool->shutdownUnusedWorkers()) > 0){ + $this->server->getLogger()->debug("Shut down $w idle async pool workers"); + } foreach($pool->getRunningWorkers() as $i){ $pool->submitTaskToWorker(new GarbageCollectionTask(), $i); } diff --git a/src/pocketmine/scheduler/AsyncPool.php b/src/pocketmine/scheduler/AsyncPool.php index dbdb1de9d..f669b00bd 100644 --- a/src/pocketmine/scheduler/AsyncPool.php +++ b/src/pocketmine/scheduler/AsyncPool.php @@ -317,6 +317,19 @@ class AsyncPool{ $this->collectWorkers(); } + public function shutdownUnusedWorkers() : int{ + $ret = 0; + foreach($this->workerUsage as $i => $usage){ + if($usage === 0){ + $this->workers[$i]->quit(); + unset($this->workers[$i], $this->workerUsage[$i]); + $ret++; + } + } + + return $ret; + } + /** * Cancels all pending tasks and shuts down all the workers in the pool. */