Rolf B: Projektvorstellung: MVar - low-level Bibliothek für Nebenläufigkeit

Beitrag lesen

problematische Seite

Hallo 1unitedpower,

TypeScript kann sicherstellen, dass eine Verzweigung auf einem Wert von Typen Task, alle Fälle erschöpfend abdeckt.

Ok, der Else-Fall geht schief wenn vorher nicht N-1 Ausprägungen von Task abgefragt wurden. Polymorphie hat aber noch den weiteren Vorteil, dass Du gar nicht erst abfragen musst, sondern einfach den Task in der Queue machen lässt, was vorbereitet wurde.

Wenn ich so weiter drüber nachdenke - bei neuen Tasks musst Du mit Polymorphie die Queueverarbeitung nicht ändern. Deine Implementierung ist also nicht sOlid. Man kann von deiner MVar nicht erben, wenn man neue Tasks braucht. Da ist schon die Task-Enumeration falsch, das müsste eigentlich ein Interface sein.

Die Rekursion habe ich auf dem Spielplatz von typescriptlang.org ausprobiert, da wusste ich wenigstens welche TS Version er nimmt.

Ich habe sowas gemacht:

var x = MVar.newEmpty<string>();
x.swap("bar").then(receiveBar);
x.swap("hon").then(w => console.log("Got a " + w));

x.put("foo");

function receiveBar(w: string) {
    console.log("receiveBar/ Got a " + w)
    x.swap("bark").then(receiveBar);
}

function receiveHon(w: string) {
    console.log("receiveHon/ Got a " + w)
    x.swap("honk").then(receiveHon);
}

und jetzt bin ich froh, dass Christian den Autosave ins Forum gebaut hat, ich musste den Browser abschießen. Dabei habe ich beim zweiten Swap sogar noch vergessen, die receiveHon-Funktion einzusetzen. Drei Chrome-Prozesse liefen damit auf je 33% CPU (bei 4 Kernen eines virtuellen Prozessors).

Man musste aber definitiv die swap-Aufrufe in die Receiver einbauen, sonst ist nichts passiert. Ich lag also falsch. Wenn die taskQueue leer ist, ist sie leer.

Dann hab ich noch was gespielt:

var x = MVar.newEmpty<string>();

x.swap("bar").then(data => receiveData("bar", data));
x.swap("hon").then(data => receiveData("hon", data));
x.take().then(data => receiveData("tk1", data));
x.take().then(data => receiveData("tk2", data));
x.take().then(data => receiveData("tk3", data));

console.log("pushing data");

x.put("foo");
x.put("moo");
x.put("boo");
x.put("zoo");

function receiveData(at: string, w: string) {
  console.log("receive at " + at + " / got " + w)
}

Welche Ausgabe sagst Du voraus?

Was mich ein bisschen fuchst, ist mein Unverständnis von Typescript und auch von async/await. Ich kapier's auch in C# nicht wirklich. Eigentlich sollten async und await doch im Stande sein, Promises komplett zu abstrahieren. Der Gebrauch der Promise-Klasse bedeutet nämlich, dass man keinen Downcompile mehr für ES5 machen kann. Schöner wär's also, wenn man rein mit dem async/await Mechanismus auskäme. Ich krieg nur einen Knoten in's Hirn bei dem Versuch, dann die Auflösung des Promise an die Task-Queue zu delegieren.

Rolf

--
sumpsi - posui - clusi