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('data A');
$channel->send('data B');
$channel->close();
});
spawn(function() use ($channel) {
$futureA = $channel->recvAsync();
$futureB = $channel->recvAsync();
// Можна виконувати іншу роботу, поки дані ще не потрібні
doSomeWork();
echo await($futureA) . "\n"; // "data A"
echo await($futureB) . "\n"; // "data 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