Alle Portoperationen in Rebol 3 sind asynchron. Die einzige Möglichkeit, eine synchrone Kommunikation durchzuführen, ist das Anrufen wait
.
Das Problem beim Aufrufen von wait besteht in diesem Fall darin, dass Ereignisse für alle offenen Ports überprüft werden (auch wenn sie sich nicht in dem zum Warten übergebenen Portblock befinden). Dann rufen sie ihre antwortenden Ereignishandler auf, aber in einem dieser Ereignishandler kann ein Lese- / Schreibvorgang durchgeführt werden. Dies könnte zu rekursiven Aufrufen zum "Warten" führen.
Wie komme ich darum herum?
asynchronous
io
rebol
rebol3
Shixin Zeng
quelle
quelle
Antworten:
Warum erstellen Sie nicht eine Art "Puffer" -Funktion, um alle Nachrichten von assynkronen Einträgen zu empfangen und als FIFO (First-In, First-Out) zu verarbeiten?
Auf diese Weise können Sie die Assync-Eigenschaften Ihrer Ports beibehalten und im Synchronisierungsmodus verarbeiten.
quelle
In Fällen, in denen es nur asynchrone Ereignisse gibt und wir eine synchrone Antwort benötigen, starten Sie einen Timer oder schlafen Sie für eine Zeitüberschreitung. Wenn der Handler oder das erforderliche Ziel erreicht ist, sagen Sie true, andernfalls false und stellen Sie sicher, dass das Ereignis für das Ereignis abgebrochen / zurückgesetzt wird gleich wenn kritisch.
quelle
Ich denke, dass es zwei Designprobleme gibt (möglicherweise im Zusammenhang mit den vorliegenden Tools / Lösungen).
Wait
macht zu viel -it will check events for all open ports
. In einer soliden Umgebung sollte das Warten nur dort implementiert werden, wo es benötigt wird: pro Gerät, pro Port, pro Socket ... Das Erstellen unnötiger Abhängigkeiten zwischen gemeinsam genutzten Ressourcen kann nicht gut enden - insbesondere wenn Sie wissen, dass gemeinsam genutzte Ressourcen (auch ohne Abhängigkeiten) vorhanden sind. kann viele Probleme verursachen.Die Event-Handler tun möglicherweise zu viel. Ein Ereignishandler sollte so kurz wie möglich sein und nur das Ereignis behandeln. Wenn dies mehr bewirkt, tut der Handler zu viel - insbesondere, wenn andere gemeinsam genutzte Ressourcen beteiligt sind. In vielen Situationen speichert der Handler nur die Daten, die sonst verloren gehen. und ein asynchroner Job erledigt die komplexeren Dinge.
quelle
Sie können einfach ein Schloss verwenden. Cummunication1 kann einen globalen Sperrstatus festlegen, dh mit einer Variablen (stellen Sie sicher, dass dieser threadsicher ist).
locked = true
. Dann kann Communication2 warten, bis es entsperrt ist.quelle