ThreadPool::cancel()
(PHP 8.6+, True Async 1.0)
php
public ThreadPool::cancel(): voidLeitet ein erzwungenes Herunterfahren des Pools ein. Nachdem cancel() aufgerufen wurde:
- Jeder nachfolgende
submit()-Aufruf wirft sofortAsync\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 einerThreadPoolException(im Moduscoroutine: truemit einerCancellationException). - 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: truewerden in-flight Aufgaben tatsächlich gecancelt (ab TrueAsync 0.7.0): das atomare Flagcancel_requestedwird vor dem Schließen des Kanals gesetzt, der Worker ruftZEND_ASYNC_SCOPE_CANCEL(pool_scope, NULL, false, false), undAFTER_MAINcancelt 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
- ThreadPool::close() — Geordnetes Herunterfahren
- ThreadPool::isClosed() — Prüfen, ob der Pool geschlossen ist
- Async\ThreadPool — Komponentenübersicht und Vergleich close() vs cancel()