ThreadPool::close()
(PHP 8.6+, True Async 1.0)
php
public ThreadPool::close(): voidІніціює м'яке завершення роботи пулу. Після виклику close():
- Будь-який наступний виклик
submit()негайно кидаєAsync\ThreadPoolException. - Завдання, які вже знаходяться в черзі, продовжують виконуватись і завершуються нормально.
- Завдання, які зараз виконуються в робочих потоках, завершуються нормально.
- Метод блокує викликаючу корутину до тих пір, поки всі завдання в процесі не будуть виконані і всі робочі потоки не зупиняться.
Для негайного примусового завершення роботи, що відкидає завдання в черзі, використовуйте натомість cancel().
Значення, що повертається
void
Приклади
Приклад #1 М'яке завершення після надсилання всіх завдань
php
<?php
use Async\ThreadPool;
use function Async\spawn;
use function Async\await;
spawn(function() {
$pool = new ThreadPool(workers: 2);
$future = $pool->submit(function() {
return 'finished';
});
$pool->close(); // чекає завершення завдання вище
echo await($future), "\n"; // finished
$pool->close();
});Приклад #2 Виклик submit() після close() кидає виняток
php
<?php
use Async\ThreadPool;
use Async\ThreadPoolException;
use function Async\spawn;
spawn(function() {
$pool = new ThreadPool(workers: 2);
$pool->close();
try {
$pool->submit(fn() => 'too late');
} catch (ThreadPoolException $e) {
echo "Error: ", $e->getMessage(), "\n";
// Error: Cannot submit task: thread pool is closed
}
});Дивіться також
- ThreadPool::cancel() — примусове завершення роботи
- ThreadPool::isClosed() — перевірити, чи закритий пул
- Async\ThreadPool — огляд компонента