Ich baue ein Promela-Modell, in dem ein Prozess eine Anforderung an N andere Prozesse sendet, auf die Antworten wartet und dann einen Wert berechnet. Im Wesentlichen ein typischer Map-Reduct-Style-Ausführungsfluss. Derzeit sendet mein Modell Anfragen in einer festen Reihenfolge. Ich möchte das verallgemeinern, um eine nicht-deterministische Ordnung zu senden. Ich habe die select
Anweisung angeschaut, aber das scheint ein einzelnes Element nicht-deterministisch auszuwählen.Nachricht an Kanalgruppe in nichtdeterministischer Reihenfolge senden
Gibt es ein gutes Muster, um dies zu erreichen? Hier ist die Grundstruktur von dem, was ich arbeite mit:
#define NUM_OBJECTS 2
chan obj_req[NUM_OBJECTS] = [0] of { mtype, chan };
Dies ist das Objekt Prozess, der mit einem gewissen Wert zu msgtype
Nachrichten antwortet, dass es berechnet.
proctype Object(chan request) {
chan reply;
end:
do
:: request ? msgtype(reply) ->
int value = 23
reply ! value
od;
}
Dies ist der Client. Er sendet eine Anforderung an jedes der Objekte in der Reihenfolge 0, 1, 2, ...
und sammelt alle Antworten und reduziert die Werte.
proctype Client() {
chan obj_reply = [0] of { int };
int value
// WOULD LIKE NON-DETERMINISM HERE
for (i in obj_req) {
obj_req[i] ! msgtype(obj_reply)
obj_reply ? value
// do something with value
}
}
Und ich starten Sie das System wie dieses
init {
atomic {
run Object(obj_req[0]);
run Object(obj_req[1]);
run Client();
}
}
Wow, danke für die ausführliche Erklärung. Du weißt, dass ich in meiner Frage vielleicht expliziter hätte sein sollen. Ich denke, Ihre Lösung ist nahe an dem, was ich mir ausgedacht hatte, aber angesichts der Existenz von 'select' war meine primäre Frage: Gibt es eine wirklich elegante Möglichkeit, dies zu tun, die nicht das gesamte Schleifen und Verfolgen von Aufträgen beinhaltet. Auf jeden Fall denke ich, dass dies eine gute Frage ist, da diese Art der Kommunikation in verteilten Systemen recht häufig ist. –
@NoahWatkins * afaik *, nein, aber vielleicht weiß jemand anderes es besser –