Thread::finally
(PHP 8.6+, True Async 1.0)
php
public Thread::finally(\Closure $callback): voidРегистрирует функцию обратного вызова, которая будет выполнена при завершении потока — независимо от того, завершился ли он успешно, с исключением или был отменён.
Callback выполняется в планировщике корутин родительского потока. Допускается регистрация нескольких callback-ов; они вызываются в порядке регистрации. Callback не принимает аргументов — для получения результата или исключения используйте getResult() / getException() внутри него.
Параметры
callback : Функция без параметров, вызываемая при завершении потока.
Примеры
Пример #1 Освобождение ресурса после завершения потока
php
<?php
use function Async\spawn;
use function Async\spawn_thread;
spawn(function() {
$resource = acquireResource();
$thread = spawn_thread(function() use ($resource) {
// работа с ресурсом в потоке
return processData($resource);
});
$thread->finally(function() use ($resource, $thread) {
releaseResource($resource);
echo "Ресурс освобождён. Поток отменён: "
. ($thread->isCancelled() ? 'да' : 'нет') . "\n";
});
});Пример #2 Логирование результата потока
php
<?php
use function Async\spawn;
use function Async\spawn_thread;
use function Async\await;
spawn(function() {
$thread = spawn_thread(function() {
return array_sum(range(1, 100));
});
$thread->finally(function() use ($thread) {
if ($thread->isCancelled()) {
echo "[лог] Поток отменён\n";
} elseif ($thread->getException() !== null) {
echo "[лог] Поток завершился с ошибкой: "
. $thread->getException()->getMessage() . "\n";
} else {
echo "[лог] Поток завершился. Результат: "
. $thread->getResult() . "\n";
}
});
await($thread);
});Пример #3 Несколько callback-ов
php
<?php
use function Async\spawn;
use function Async\spawn_thread;
use function Async\await;
spawn(function() {
$thread = spawn_thread(fn() => "результат");
$thread->finally(function() { echo "Первый callback\n"; });
$thread->finally(function() { echo "Второй callback\n"; });
$thread->finally(function() { echo "Третий callback\n"; });
await($thread);
// Вывод:
// Первый callback
// Второй callback
// Третий callback
});См. также
- Thread::isCompleted() — Проверить завершение
- Thread::getResult() — Получить результат
- Thread::getException() — Получить исключение
- Thread::isCancelled() — Проверить отмену
- Async\Thread — Компонент потоков