Channel::send

(PHP 8.6+, True Async 1.0)

public Channel::send(mixed $value, ?Completable $cancellationToken = null): void

Envoie une valeur dans le canal. C’est une opération bloquante — la coroutine courante est suspendue si le canal ne peut pas accepter la valeur immédiatement.

Pour un canal rendez-vous (capacity = 0), l’expéditeur attend qu’une autre coroutine appelle recv(). Pour un canal avec tampon, l’expéditeur attend uniquement lorsque le tampon est plein.

Paramètres

value
La valeur à envoyer. Peut être de n’importe quel type.
cancellationToken
Jeton d’annulation (Completable) permettant d’interrompre l’attente selon une condition arbitraire. null — attente sans limite (par défaut). Lorsque le jeton est complété, l’opération est interrompue et une CancelledException est levée. Pour limiter l’attente dans le temps, vous pouvez utiliser Async\timeout().

Erreurs

Exemples

Exemple #1 Envoi de valeurs dans un canal

<?php

use Async\Channel;

$channel = new Channel(1);

spawn(function() use ($channel) {
    $channel->send('first');  // placé dans le tampon
    $channel->send('second'); // attend qu'un emplacement se libère
    $channel->close();
});

spawn(function() use ($channel) {
    echo $channel->recv() . "\n"; // "first"
    echo $channel->recv() . "\n"; // "second"
});

Exemple #2 Envoi avec délai d’attente

<?php

use Async\Channel;

$channel = new Channel(0); // rendez-vous

spawn(function() use ($channel) {
    try {
        $channel->send('data', Async\timeout(1000));
    } catch (\Async\CancelledException $e) {
        echo "Délai dépassé : personne n'a accepté la valeur en 1 seconde\n";
    }
});

Exemple #3 Envoi avec un jeton d’annulation personnalisé

<?php

use Async\Channel;
use Async\Future;

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

spawn(function() use ($channel, $cancel) {
    try {
        $channel->send('data', $cancel);
    } catch (\Async\CancelledException $e) {
        echo "Envoi annulé\n";
    }
});

// Annuler l'opération depuis une autre coroutine
spawn(function() use ($cancel) {
    Async\delay(500);
    $cancel->complete(null);
});

Voir aussi