Channel::close

(PHP 8.6+, True Async 1.0)

public Channel::close(): void

Закрывает канал. После закрытия:

Повторный вызов close() на уже закрытом канале не вызывает ошибок.

Примеры

Пример #1 Закрытие канала после отправки данных

<?php

use Async\Channel;

$channel = new Channel(10);

spawn(function() use ($channel) {
    for ($i = 0; $i < 5; $i++) {
        $channel->send($i);
    }
    $channel->close(); // сигнал получателю, что данных больше не будет
});

spawn(function() use ($channel) {
    foreach ($channel as $value) {
        echo "Получено: $value\n";
    }
    // foreach завершится после закрытия и опустошения буфера
    echo "Канал исчерпан\n";
});

Пример #2 Обработка закрытия ожидающими корутинами

<?php

use Async\Channel;

$channel = new Channel();

spawn(function() use ($channel) {
    try {
        $channel->send('данные'); // ожидает получателя
    } catch (\Async\ChannelException $e) {
        echo "Канал закрыт: {$e->getMessage()}\n";
    }
});

spawn(function() use ($channel) {
    delay(100); // небольшая задержка
    $channel->close(); // разблокирует отправителя с исключением
});

См. также