Signatur
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;
}
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;
// 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.