spawn

(PHP 8.6+, True Async 1.0)

spawn() — Запускает выполнение функции в новой корутине. Создаёт корутину.

Описание

spawn(callable $callback, mixed ...$args): Async\Coroutine

Создаёт и запускает новую корутину. Корутина будет выполнена асинхронно.

Параметры

callback Функция или замыкание для выполнения в корутине. Может быть любым валидным callable типом.

args Необязательные параметры, передаваемые в callback. Параметры передаются по значению.

Возвращаемое значение

Возвращает объект Async\Coroutine, представляющий запущенную корутину. Объект можно использовать для:

Примеры

Пример #1 Базовое использование spawn()

<?php
use function Async\spawn;
use function Async\await;

function fetchData(string $url): string {
    return file_get_contents($url);
}

$coroutine = spawn(fetchData(...), 'https://php.net');

// Корутина выполняется асинхронно
echo "Корутина запущена\n";

$result = await($coroutine);
echo "Результат получен\n";
?>

Пример #2 Множественные корутины

<?php
use function Async\spawn;
use function Async\await;

$urls = [
    'https://php.net',
    'https://github.com',
    'https://stackoverflow.com'
];

$coroutines = [];
foreach ($urls as $url) {
    $coroutines[] = spawn(file_get_contents(...), $url);
}

// Все запросы выполняются конкурентно
foreach ($coroutines as $coro) {
    $content = await($coro);
    echo "Загружено: " . strlen($content) . " байт\n";
}
?>

Пример #3 Использование с замыканием

<?php
use function Async\spawn;
use function Async\await;

$userId = 123;

$coroutine = spawn(function() use ($userId) {
    $userData = file_get_contents("https://api/users/$userId");
    $userOrders = file_get_contents("https://api/orders?user=$userId");

    return [
        'user' => json_decode($userData),
        'orders' => json_decode($userOrders)
    ];
});

$data = await($coroutine);
print_r($data);
?>

Пример #4 spawn с Scope

<?php
use function Async\spawn;
use Async\Scope;

$scope = new Scope();

spawn with $scope function() {
    echo "Корутина 1\n";
};

spawn with $scope function() {
    echo "Корутина 2\n";
};

// Ожидаем завершения всех корутин в scope
$scope->awaitCompletion();
?>

Пример #5 Передача параметров

<?php
use function Async\spawn;
use function Async\await;

function calculateSum(int $a, int $b, int $c): int {
    return $a + $b + $c;
}

$coroutine = spawn(calculateSum(...), 10, 20, 30);
$result = await($coroutine);

echo "Сумма: $result\n"; // Сумма: 60
?>

Пример #6 Обработка ошибок

Один из способов обработать исключение из корутины, использовать функцию await():

<?php
use function Async\spawn;
use function Async\await;

$coroutine = spawn(function() {
    if (rand(0, 1)) {
        throw new Exception("Случайная ошибка");
    }
    return "Успех";
});

try {
    $result = await($coroutine);
    echo $result;
} catch (Exception $e) {
    echo "Ошибка: " . $e->getMessage();
}
?>

Примечания

Примечание: Корутины, созданные через spawn(), выполняются конкурентно, но не параллельно. PHP TrueAsync использует однопоточную модель выполнения.

Примечание: Параметры передаются в корутину по значению. Для передачи по ссылке используйте замыкание с use (&$var).

Changelog

Версия Описание
1.0.0 Добавлена функция spawn()

См. также