Start · Sprachen · PHP · Referenz · parallel\Events\Input

parallel\Events\Input

Klasse

Stellt Eingabewerte bereit, die beim Verarbeiten von <code>parallel\Events</code> an Channels oder Futures übermittelt werden.

seit PHP 1.1.0 Kategorie: misc

Signatur

class parallel\Events\Input

Beschreibung

parallel\Events\Input ist ein Eingabe-Container, der verwendet wird, um Werte zu definieren, die beim nächsten Lesezugriff auf einen Channel innerhalb eines parallel\Events-Ereignis-Loops an diesen geschrieben werden sollen. Er ermöglicht es, asynchrone Schreiboperationen in das Ereignis-System einzubinden, ohne den Ablauf blockieren zu müssen.

Typischerweise wird eine Input-Instanz einem parallel\Events-Objekt über dessen Methode setInput() zugewiesen. Für jeden überwachten Channel, auf den geschrieben werden soll, wird über Input::add() ein Zielname und ein Wert hinterlegt. Der Events-Loop nutzt diese Angaben, sobald ein entsprechendes Events\Event vom Typ Write verarbeitet wird.

Dieser Ansatz eignet sich vor allem in Parallelverarbeitungs-Szenarien, in denen mehrere Tasks gleichzeitig laufen und über Channels kommunizieren. Statt einzelner blockierender Channel-Operationen können damit mehrere Schreibvorgänge koordiniert und kontrolliert ausgeführt werden.

Mit Input::remove() lässt sich ein zuvor registrierter Eintrag wieder entfernen, beispielsweise wenn ein Channel nach einer einmaligen Nutzung nicht mehr beschrieben werden soll.

Beispiele

Eingabewerte für einen Events-Loop registrieren

<?php
use parallel\Channel;
use parallel\Events;
use parallel\Events\Input;
use parallel\Runtime;

$channel = new Channel();

$runtime = new Runtime();
$runtime->run(function() use ($channel) {
    $value = $channel->recv();
    echo "Task empfangen: " . $value . PHP_EOL;
});

$input = new Input();
$input->add($channel, 42);

$events = new Events();
$events->addChannel($channel);
$events->setInput($input);
$events->setTimeout(0);

while ($event = $events->poll()) {
    echo "Ereignis: " . $event->type . PHP_EOL;
}
Ereignis: 2

Eingabewert hinzufügen und wieder entfernen

<?php
use parallel\Channel;
use parallel\Events\Input;

$channelA = new Channel();
$channelB = new Channel();

$input = new Input();
$input->add($channelA, 'Hallo');
$input->add($channelB, 'Welt');

// channelB wird nicht mehr benötigt
$input->remove($channelB);

// Nur channelA besitzt noch einen Eingabewert
echo "Eingaben konfiguriert." . PHP_EOL;
Eingaben konfiguriert.

// Wichtig · Fallstricke

Achtung: parallel\Events\Input ist Teil der parallel-Erweiterung, die nur mit Thread-sicherem PHP (ZTS – Zend Thread Safety) und PHP 8.0+ korrekt funktioniert. Auf nicht-ZTS-Builds steht die Erweiterung nicht zur Verfügung.

Wird einem Channel ein Eingabewert zugewiesen, darf nur ein serialisierbarer Wert übergeben werden – Ressourcen, nicht-serialisierbare Objekte oder Closures führen zu einem Laufzeitfehler.

Die Methoden add() und remove() erwarten als erstes Argument entweder ein parallel\Channel-Objekt oder dessen String-Namen, je nach Kontext.