4D v16 R6 führt ein neues Konzept für die Kommunikation zwischen Prozessen ein: Shared Object und Shared Collection Variablen! Sie sind eine Lösung , um die Verwendung von Interprozess-Variablen (die im Multi-Thread-Modus nicht verwendet werden können) zu vermeiden. Dank dieser Lösung können Sie Informationen zwischen präemptiven Prozessen leicht austauschen.
Neues Konzept: gemeinsame Objekte/Sammlungen
In der Welt der Computerprogrammierung gilt: Je weniger Daten Sie gemeinsam nutzen, desto effizienter sind Sie. Aber natürlich müssen in den meisten Fällen die Prozesse, die Sie erstellt haben, miteinander kommunizieren. Entweder um Parameter zu senden, um Ergebnisse zu erhalten oder einfach um auf gemeinsame Informationen zuzugreifen. Das ist der Grund, warum Shared Objects und Shared Collections geschaffen wurden! (Denken Sie daran, dass normale Objekte und Sammlungen nicht zwischen Prozessen geteilt werden können. Wenn sie als Parameter übergeben werden, wird eine Kopie der Objekte erstellt).
Shared Object s und Shared Collections verhalten sich genauso wie normale Objekte, außer dass sie bei ihrer Instanziierung mit den folgenden neuen Befehlen als „shared“ deklariert werden müssen: Neues gemeinsames Objekt und Neue gemeinsame Sammlung. Sobald sie instanziiert sind, können sie direkt, wie alle anderen, zum Lesen verwendet werden. Es wird kein Semaphor oder sonstiges benötigt, sondern die Shared Objects werden einfach verwendet.
Zum Schreiben oder Ändern müssen die Shared Objects von den Schlüsselwörtern Use und End use umgeben sein. Diese Schlüsselwörter setzen interne Semaphoren und müssen verwendet werden, um im Schreibmodus auf den Inhalt von Objekten und Sammlungen zuzugreifen. Die Verwendung dieser Schlüsselwörter ist wirklich einfach, viel einfacher als die Semaphoren der 4D-Sprache. Wie das? Man darf nicht vergessen, sie freizugeben. Use und End use umschließen die Variablen immer, so dass Sie nicht vergessen können, die Sperre aufzuheben.
$object:=New shared object
$ps:=New process("my process";0; "myprocess";$object) // als Referenz gesendet
Use ($object)
$object .myAttribute:=10
End use
Wie kann man sie in anderen Prozessen verwenden?
Sie werden sich vielleicht fragen: Wie kann ich ein gemeinsam genutztes Objekt von einem anderen Prozess verwenden (auf andere Weise als durch Senden eines Parameters)? Wie kann ich ohne Interprozess-Variablen gemeinsam nutzen?
Ein „super-shared“ Objekt löst dieses Problem. Ein neuer Befehl, Storage, ermöglicht den Zugriff auf dieses Objekt für alle laufenden Prozesse.
Dieses Objekt ist auf jeder Maschine einzigartig. Eines (im Einzelbenutzermodus), ansonsten eines pro Client und eines auf dem Server. Der Befehl Storage gibt das freigegebene Objekt zurück, so dass es wie jedes andere freigegebene Objekt manipuliert werden kann, aber es kann nur freigegebene Objekte oder freigegebene Sammlungen enthalten. (Beachten Sie, dass Komponenten auch selbst Storage enthalten können)
Use (Storage)
Storage .myCollection:=New shared collection
End use
Vorteile
Shared Objects und Shared Collections haben im Vergleich zu Standard-Interprozessvariablen viele Vorteile, wie z.B:
- kein Schutz beim Lesen erforderlich: schneller Zugriff
- Use- und End Use-Schlüsselwörter vermeiden Codierungsfehler, die zu Deadlock-Szenarien führen
- Da Objekte oder Sammlungen in der Regel hierarchisch aufgebaut sind (sie enthalten andere Objekte oder Sammlungen), wird durch das Sperren eines Objekts die gesamte Kette auf einmal gesperrt, was die Leistung verbessert.
Sie werden sich schnell an gemeinsam genutzte Objekte und Sammlungen gewöhnen und es wird zu einer natürlichen Art der Programmierung werden 🙂