Channel::recv

(PHP 8.6+, True Async 1.0)

public Channel::recv(?Completable $cancellationToken = null): mixed

채널에서 다음 값을 수신합니다. 이것은 블로킹 연산입니다 — 채널에 사용 가능한 값이 없으면 현재 코루틴이 일시 중단됩니다.

채널이 닫혀 있고 버퍼가 비어있으면 ChannelException이 발생합니다. 채널이 닫혀 있지만 버퍼에 값이 남아있으면 해당 값이 반환됩니다.

매개변수

cancellationToken
취소 토큰(Completable)으로, 임의의 조건에 따라 대기를 중단할 수 있습니다. null — 무한 대기 (기본값). 토큰이 완료되면 연산이 중단되고 CancelledException이 발생합니다. 시간 제한이 필요한 경우 Async\timeout()을 사용할 수 있습니다.

반환값

채널의 다음 값 (mixed).

오류

예제

예제 #1 채널에서 값 수신

<?php

use Async\Channel;

$channel = new Channel(5);

spawn(function() use ($channel) {
    for ($i = 1; $i <= 5; $i++) {
        $channel->send($i);
    }
    $channel->close();
});

spawn(function() use ($channel) {
    try {
        while (true) {
            $value = $channel->recv();
            echo "수신됨: $value\n";
        }
    } catch (\Async\ChannelException) {
        echo "채널이 닫혔고 비어있습니다\n";
    }
});

예제 #2 타임아웃을 지정한 수신

<?php

use Async\Channel;

$channel = new Channel();

spawn(function() use ($channel) {
    try {
        $value = $channel->recv(Async\timeout(2000));
        echo "수신됨: $value\n";
    } catch (\Async\CancelledException) {
        echo "2초 내에 데이터가 도착하지 않았습니다\n";
    }
});

예제 #3 사용자 정의 취소 토큰을 사용한 수신

<?php

use Async\Channel;
use Async\Future;

$channel = new Channel();
$cancel = new Future();

spawn(function() use ($channel, $cancel) {
    try {
        $value = $channel->recv($cancel);
        echo "수신됨: $value\n";
    } catch (\Async\CancelledException) {
        echo "수신이 취소되었습니다\n";
    }
});

// 다른 코루틴에서 취소
spawn(function() use ($cancel) {
    Async\delay(500);
    $cancel->complete(null);
});

같이 보기