ThreadPool::cancel()
(PHP 8.6+, True Async 1.0)
php
public ThreadPool::cancel(): voidInicia un apagado forzado del pool. Después de llamar a cancel():
- Cualquier llamada posterior a
submit()lanza inmediatamenteAsync\ThreadPoolException. - Las tareas que esperan en la cola (aún no recogidas por un trabajador) son rechazadas inmediatamente — sus objetos
Futurecorrespondientes pasan al estado rechazado con unaThreadPoolException(o, en modocoroutine: true, con unaCancellationException). - En el modo habitual (
coroutine: false), las tareas que ya se están ejecutando en los hilos de trabajo se llevan hasta el final de la tarea actual: interrumpir forzosamente código PHP dentro de un hilo del SO no es posible. - En el modo
coroutine: true, las tareas in-flight se cancelan de verdad (desde TrueAsync 0.7.0): se activa el flag atómicocancel_requestedantes de cerrar el canal, el worker invocaZEND_ASYNC_SCOPE_CANCEL(pool_scope, NULL, false, false)yAFTER_MAINcancela en cascada todos los child-scopes de las tareas en curso. - Los trabajadores se detienen tan pronto como terminan la tarea actual y no recogen ninguna tarea nueva de la cola.
Para un apagado gracioso en el que todas las tareas en cola se ejecuten hasta el final, usa close() en su lugar.
Valor de retorno
void
Ejemplos
Ejemplo #1 Cancelación forzada con tareas en cola
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);
// Llenar la cola con 8 tareas en 2 trabajadores
$futures = [];
for ($i = 0; $i < 8; $i++) {
$futures[] = $pool->submit(function() use ($i) {
$t = microtime(true);
while (microtime(true) - $t < 0.2) {}
return $i;
});
}
// Cancelar inmediatamente — las tareas en la cola son rechazadas
$pool->cancel();
$done = 0;
$cancelled = 0;
foreach ($futures as $f) {
try {
await($f);
$done++;
} catch (ThreadPoolException $e) {
$cancelled++;
}
}
echo "completadas: $done\n"; // 2 (ya en ejecución cuando se llamó a cancel())
echo "canceladas: $cancelled\n"; // 6 (aún estaban en la cola)
});Véase también
- ThreadPool::close() — apagado gracioso
- ThreadPool::isClosed() — comprobar si el pool está cerrado
- Async\ThreadPool — resumen del componente y comparación close() vs cancel()