Channel::recvAsync
(PHP 8.6+, True Async 1.0)
public Channel::recvAsync(): Future
Выполняет неблокирующее получение значения из канала и возвращает объект Future,
который можно дождаться позже.
В отличие от recv(), этот метод не приостанавливает текущую корутину немедленно.
Вместо этого возвращается Future, который будет разрешён, когда значение станет доступным.
Возвращаемые значения
Объект Future, который разрешится полученным значением из канала.
Примеры
Пример #1 Неблокирующее получение
<?php
use Async\Channel;
$channel = new Channel(3);
spawn(function() use ($channel) {
$channel->send('данные A');
$channel->send('данные B');
$channel->close();
});
spawn(function() use ($channel) {
$futureA = $channel->recvAsync();
$futureB = $channel->recvAsync();
// Можно выполнять другую работу, пока данные не понадобятся
doSomeWork();
echo await($futureA) . "\n"; // "данные A"
echo await($futureB) . "\n"; // "данные B"
});
Пример #2 Параллельное получение из нескольких каналов
<?php
use Async\Channel;
$orders = new Channel(10);
$notifications = new Channel(10);
spawn(function() use ($orders, $notifications) {
$orderFuture = $orders->recvAsync();
$notifFuture = $notifications->recvAsync();
// Ожидаем первое доступное значение из любого канала
[$result, $index] = awaitAnyOf($orderFuture, $notifFuture);
echo "Получено из канала #$index: $result\n";
});
См. также
- Channel::recv — Блокирующее получение
- Channel::sendAsync — Неблокирующая отправка
- await — Ожидание Future