Channel::__construct
(PHP 8.6+, True Async 1.0)
public Channel::__construct(int $capacity = 0)
Создаёт новый канал для передачи данных между корутинами.
Канал — это примитив синхронизации, позволяющий корутинам безопасно обмениваться данными.
Поведение канала зависит от параметра $capacity:
capacity = 0— канал-рандеву (unbuffered). Операцияsend()приостанавливает отправителя до тех пор, пока другая корутина не вызоветrecv(). Это обеспечивает синхронную передачу данных.capacity > 0— буферизованный канал. Операцияsend()не блокирует, пока в буфере есть место. Когда буфер заполнен, отправитель приостанавливается до освобождения места.
Параметры
- capacity
- Ёмкость внутреннего буфера канала.
0— канал-рандеву (по умолчанию), отправка блокирует до получения. Положительное число — размер буфера.
Примеры
Пример #1 Канал-рандеву (unbuffered)
<?php
use Async\Channel;
$channel = new Channel(); // capacity = 0
spawn(function() use ($channel) {
$channel->send('привет'); // приостановится, пока кто-то не вызовет recv()
echo "Отправлено\n";
});
spawn(function() use ($channel) {
$value = $channel->recv(); // получит 'привет', разблокирует отправителя
echo "Получено: $value\n";
});
Пример #2 Буферизованный канал
<?php
use Async\Channel;
$channel = new Channel(3); // буфер на 3 элемента
spawn(function() use ($channel) {
$channel->send(1); // не блокирует — буфер пуст
$channel->send(2); // не блокирует — место есть
$channel->send(3); // не блокирует — последний слот
$channel->send(4); // приостановится — буфер полон
});
См. также
- Channel::send — Отправить значение в канал
- Channel::recv — Получить значение из канала
- Channel::capacity — Узнать ёмкость канала
- Channel::close — Закрыть канал