Wie eine asynchrone Dart-Aufruf synchron?

Ich bin auf dem Weg zu bewerten Dart für eine Deutsche Firma, die von der Portierung diverser Java-Programme zu Dart und zu vergleichen und die Ergebnisse analysieren. Im browser Dart gewinnt Hände nach unten. Für die server-software die Leistung schien ein ernstes isssue (siehe diese Frage von mir) aber das hat meist entschärft.

Nun bin ich im Bereich der Portierung von einigen "einfachen" Befehl-Linie Werkzeuge, bei denen ich nicht erwarten, dass alle ernsthaften Probleme, aber es gibt wenigstens eins. Einige der tools, tun, machen, HTTP-Anfragen zu sammeln, die Daten und den stand-alone-Dart virtual machine unterstützt nur diese in einem asynchronen Mode. Suche durch alle die ich finden konnte, scheint es nicht möglich zu sein, verwenden Sie alle asynchronen Aufruf in eine meist synchrone software.

Verstehe ich, ich könnte die Umstrukturierung der verfügbaren synchronen software in einem asynchronen ein. Aber diese machen würde ein gut gestaltetes Stück software in etwas weniger lesbar und schwerer zu Debuggen und zu warten. Für einige software-Stücke, die diese macht einfach keinen Sinn.
Meine Frage: gibt es eine (übersehen von mir) Möglichkeit zum einbetten von einer asynchronen Aufruf in eine synchron aufgerufene Methode?

Ich kann mir vorstellen, dass es nicht zu schwierig, ein system-call, nutzbar nur innerhalb des Haupt-Threads, die nur überträgt den Vollzug an die ganze Liste der in der Warteschlange asynchrone Funktionsaufrufe (die zimmerreserviereung, ohne das Ende der Haupt-thread der ersten), und sobald der Letzte hat ausgeführt, gibt und weiterhin den Haupt-thread.

Etwas, das könnte wie folgt Aussehen:

var synchFunction() {
  var result;
  asyncFunction().then(() { result = ...; });

  resync(); //the system call to move to and wait out all async execution

  return result;
}

Dass eine solche Methode vereinfacht würde die lib-APIs als auch. Die meisten "sync" nennt, könnte entfernt werden, weil die re-synchronisation aufrufen, würde die Arbeit machen. Es scheint wie eine logische Idee, ich finde es immer noch irgendwie existiert, und ich es verpasst haben. Oder gibt es einen ernsthaften Grund, warum das nicht funktionieren würde?


Nach denken über die empfangene Antwort aus lm (siehe unten) für die zwei Tage, die ich immer noch nicht verstehen, warum die Kapselung eines asynchronen Dart-call-in eine synchrone man sollte nicht möglich sein. Es ist getan in die "normale" synchrone Programmierung Welt die ganze Zeit. In der Regel können Sie warten, bis eine erneute Synchronisierung durchführen, indem Sie entweder immer ein "Fertig" von der asynchrone routine oder wenn etwas nicht weiter nach einem timeout.

In diesem Sinne mein Erster Vorschlag könnte verbessert werden, wie:

var synchFunction() {
  var result;
  asyncFunction()
    .then(() { result = ...; })
    .whenComplete(() { continueResync() }); //the "Done" message

  resync(timeout); //waiting with a timeout as maximum limit

  //Either we arrive here with the [result] filled in or a with a [TimeoutException].
  return result;
}

Den resync() macht das gleiche, das normalerweise geschehen würde, nachdem er die main Methode ein Isolat ist, beginnt es die Ausführung der in der Warteschlange von asynchronen Funktionen (oder wartet auf Ereignisse, um Sie ausführbar). Sobald es auf eine continueResync() Aufruf ein flag gesetzt, welches verhindert, dass dieses asynchrone Ausführung und resync() kehrt zu dem Haupt-thread. Wenn keine continueResync() nennen ist aufgetreten, während die gegebenen timeout Zeit es zu bricht die asynchrone Ausführung und Blätter resync() mit einem TimeoutException.

Für einige Gruppen von software, die nutzen aus gerade synchronen Programmierung (nicht die client-software und nicht der server-software) eine solche Funktion würde lösen viele Probleme für die Programmierer, die sich mit asynchrounous-nur Bibliotheken.

Ich glaube, dass ich auch eine Lösung gefunden für das Haupt-argument in lm's argumentation weiter unten. Deshalb meine Frage steht immer noch mit Bezug auf das "enhanced" - Lösung, die ich vorgeschlagen habe: gibt es etwas, das wirklich macht es unmöglich, zu implementieren, dass in Dart?

  • Es ist nicht unmöglich, aber es würde eine wichtige re-Architektur des Dart-runtime-Philosophie, und vielleicht brauchen würde, Dart-multi-threaded. Wenn Sie es machen, Dart-multi-threaded dann Dart-Programmierer würden alle haben zu Beginn den Umgang mit thread-Synchronisation-Probleme, das würde erheblich erschweren das Leben eines jeden einzelnen sowie brechen eine Menge von vorhandenen code.
Schreibe einen Kommentar