available_parallelism
(PHP 8.6+, True Async 1.0)
Async\available_parallelism() возвращает число CPU, доступных текущему процессу.
Описание
namespace Async;
function available_parallelism(): intУчитывает cgroup CPU-квоты, sched_setaffinity и аналогичные ограничения. Это то значение, которое рекомендует libuv для размера thread-pool / worker-pool. Всегда >= 1.
В контейнере с cpu.max=2 функция вернёт 2, а не физическое число ядер хоста. На bare-metal — число логических ядер за вычетом ограничений affinity (если они выставлены).
Бэкенд: uv_available_parallelism() с fallback на uv_cpu_info.
Возвращаемое значение
int — число CPU, гарантированно >= 1.
Примеры
Пример #1 Размер пула под доступные CPU
<?php
use Async\ThreadPool;
use function Async\available_parallelism;
// Идиоматично: автодетект уже встроен в ThreadPool через workers=0,
// но явный вызов нужен, когда вы хотите масштабировать что-то другое.
$pool = new ThreadPool(workers: available_parallelism());Пример #2 Размер worker-pool HTTP-сервера
<?php
use TrueAsync\HttpServer;
use TrueAsync\HttpServerConfig;
use function Async\available_parallelism;
$server = new HttpServer(
(new HttpServerConfig())
->addListener('0.0.0.0', 8080)
->setWorkers(available_parallelism())
);
$server->start();Пример #3 Диагностика окружения
<?php
use function Async\available_parallelism;
echo "Process can use ", available_parallelism(), " CPU(s)\n";
// В Docker с `--cpus=2` → 2
// На хосте с 16 ядрами без ограничений → 16
// В Kubernetes pod с requests/limits cpu=1 → 1Примечания
Совет: для пулов воркеров
ThreadPoolиHttpServer::setWorkers()можно вообще не вызывать эту функцию руками — оба компонента используютavailable_parallelism()автоматически, если размер пула задан как0.
На большинстве IO-bound нагрузок осмысленно оверкоммитить на
N + 1илиN + 2— за счёт того, что некоторые воркеры будут заблокированы в I/O.
См. также
- Async\ThreadPool — где значение используется автоматически
- Async\cpu_usage() — текущая загрузка процесса и системы
- Async\loadavg() — средняя длина run-queue