KomponentenChannel::__construct

Channel::__construct

(PHP 8.6+, True Async 1.0)

php
public Channel::__construct(int $capacity = 0, int $noProducerTimeout = 0, int $noConsumerTimeout = 0, bool $hardTimeouts = false)

Erstellt einen neuen Channel zur Datenübergabe zwischen Coroutinen.

Ein Channel ist ein Synchronisationsprimitiv, das Coroutinen den sicheren Datenaustausch ermöglicht. Das Verhalten des Channels hängt vom Parameter $capacity ab:

  • capacity = 0 — Rendezvous-Channel (ungepuffert). Die send()-Operation suspendiert den Sender, bis eine andere Coroutine recv() aufruft. Dies gewährleistet synchrone Datenübertragung.
  • capacity > 0 — Gepufferter Channel. Die send()-Operation blockiert nicht, solange im Puffer Platz ist. Wenn der Puffer voll ist, wird der Sender suspendiert, bis Platz frei wird.

Parameter

capacity : Die Kapazität des internen Puffers des Channels. 0 — Rendezvous-Channel (Standard), Senden blockiert bis zum Empfang. Positive Zahl — Puffergröße.

Beispiele

Beispiel #1 Rendezvous-Channel (ungepuffert)

php
<?php

use Async\Channel;

$channel = new Channel(); // capacity = 0

spawn(function() use ($channel) {
    $channel->send('hello'); // Suspendiert, bis jemand recv() aufruft
    echo "Gesendet\n";
});

spawn(function() use ($channel) {
    $value = $channel->recv(); // Empfängt 'hello', entsperrt den Sender
    echo "Empfangen: $value\n";
});

Beispiel #2 Gepufferter Channel

php
<?php

use Async\Channel;

$channel = new Channel(3); // Puffer für 3 Elemente

spawn(function() use ($channel) {
    $channel->send(1); // Blockiert nicht — Puffer ist leer
    $channel->send(2); // Blockiert nicht — Platz verfügbar
    $channel->send(3); // Blockiert nicht — letzter Platz
    $channel->send(4); // Suspendiert — Puffer ist voll
});

Siehe auch