KomponentenThreadPool::cancel()

ThreadPool::cancel()

(PHP 8.6+, True Async 1.0)

php
public ThreadPool::cancel(): void

Leitet ein erzwungenes Herunterfahren des Pools ein. Nachdem cancel() aufgerufen wurde:

  • Jeder nachfolgende submit()-Aufruf wirft sofort Async\ThreadPoolException.
  • Aufgaben, die in der Warteschlange warten (noch nicht von einem Worker aufgenommen), werden sofort abgelehnt — ihre entsprechenden Future-Objekte wechseln in den abgelehnten Zustand mit einer ThreadPoolException (im Modus coroutine: true mit einer CancellationException).
  • Im regulären Modus (coroutine: false) laufen bereits in Worker-Threads ausgeführte Aufgaben bis zum Abschluss der aktuellen Aufgabe — ein gewaltsames Unterbrechen von PHP-Code innerhalb eines OS-Threads ist nicht möglich.
  • Im Modus coroutine: true werden in-flight Aufgaben tatsächlich gecancelt (ab TrueAsync 0.7.0): das atomare Flag cancel_requested wird vor dem Schließen des Kanals gesetzt, der Worker ruft ZEND_ASYNC_SCOPE_CANCEL(pool_scope, NULL, false, false), und AFTER_MAIN cancelt kaskadiert alle Child-Scopes der laufenden Aufgaben.
  • Worker stoppen, sobald sie die aktuelle Aufgabe abgeschlossen haben, und nehmen keine neuen Aufgaben aus der Warteschlange an.

Für ein geordnetes Herunterfahren, bei dem alle wartenden Aufgaben abgeschlossen werden, verwenden Sie stattdessen close().

Rückgabewert

void

Beispiele

Beispiel #1 Hartes Abbrechen mit Aufgaben in der Warteschlange

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);

    // Warteschlange mit 8 Aufgaben auf 2 Worker verteilen
    $futures = [];
    for ($i = 0; $i < 8; $i++) {
        $futures[] = $pool->submit(function() use ($i) {
            $t = microtime(true);
            while (microtime(true) - $t < 0.2) {}
            return $i;
        });
    }

    // Sofort abbrechen — Aufgaben in der Warteschlange werden abgelehnt
    $pool->cancel();

    $done = 0;
    $cancelled = 0;
    foreach ($futures as $f) {
        try {
            await($f);
            $done++;
        } catch (ThreadPoolException $e) {
            $cancelled++;
        }
    }

    echo "done:      $done\n";      // 2  (liefen bereits, als cancel() aufgerufen wurde)
    echo "cancelled: $cancelled\n"; // 6  (waren noch in der Warteschlange)
});

Siehe auch