ThreadPool::cancel()
(PHP 8.6+, True Async 1.0)
php
public ThreadPool::cancel(): voidAvvia un arresto forzato del pool. Dopo la chiamata a cancel():
- Qualsiasi successiva chiamata a
submit()lancia immediatamenteAsync\ThreadPoolException. - I task in attesa nella coda (non ancora presi da un worker) vengono immediatamente rifiutati — i corrispondenti oggetti
Futuretransitano allo stato rifiutato conThreadPoolException(in modalitàcoroutine: trueconCancellationException). - In modalità normale (
coroutine: false) i task già in esecuzione nei thread worker vengono portati a completamento del task corrente — interrompere forzatamente il codice PHP all'interno di un thread OS non è possibile. - In modalità
coroutine: truei task in volo vengono effettivamente cancellati (a partire da TrueAsync 0.7.0): il flag atomicocancel_requestedviene impostato prima della chiusura del canale, il worker chiamaZEND_ASYNC_SCOPE_CANCEL(pool_scope, NULL, false, false)eAFTER_MAINcancella a cascata tutti gli scope figli dei task avviati. - I worker si fermano non appena terminano il task corrente e non prendono altri task dalla coda.
Per un arresto controllato che lascia completare tutti i task in coda, usare close().
Valore restituito
void
Esempi
Esempio #1 Cancellazione forzata con task in coda
php
<?php
use Async\ThreadPool;
use Async\ThreadPoolException;
use function Async\spawn;
use function Async\await;
spawn(function() {
$pool = new ThreadPool(workers: 2, queueSize: 10);
// Riempire la coda con 8 task su 2 worker
$futures = [];
for ($i = 0; $i < 8; $i++) {
$futures[] = $pool->submit(function() use ($i) {
$t = microtime(true);
while (microtime(true) - $t < 0.2) {}
return $i;
});
}
// Cancellazione immediata — i task in coda vengono rifiutati
$pool->cancel();
$done = 0;
$cancelled = 0;
foreach ($futures as $f) {
try {
await($f);
$done++;
} catch (ThreadPoolException $e) {
$cancelled++;
}
}
echo "completati: $done\n"; // 2 (già in esecuzione quando cancel() è stato chiamato)
echo "cancellati: $cancelled\n"; // 6 (erano ancora in coda)
});Vedere anche
- ThreadPool::close() — arresto controllato
- ThreadPool::isClosed() — verificare se il pool è chiuso
- Async\ThreadPool — panoramica del componente e confronto close() vs cancel()