ComponentesThreadPool::cancel()

ThreadPool::cancel()

(PHP 8.6+, True Async 1.0)

php
public ThreadPool::cancel(): void

Inicia un apagado forzado del pool. Después de llamar a cancel():

  • Cualquier llamada posterior a submit() lanza inmediatamente Async\ThreadPoolException.
  • Las tareas que esperan en la cola (aún no recogidas por un trabajador) son rechazadas inmediatamente — sus objetos Future correspondientes pasan al estado rechazado con una ThreadPoolException (o, en modo coroutine: true, con una CancellationException).
  • 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ómico cancel_requested antes de cerrar el canal, el worker invoca ZEND_ASYNC_SCOPE_CANCEL(pool_scope, NULL, false, false) y AFTER_MAIN cancela 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