Wie läuft async / seriell und parallel?

9

Ich habe zwei async -Funktionen. Beide warten auf zwei 3 Sekunden Funktionsaufrufe. Aber der zweite ist schneller als der erste. Ich denke, der schnellere läuft parallel und der andere seriell. Ist meine Annahme richtig? Wenn ja, warum passiert das, da beide Funktionen logisch gleich aussehen?

%Vor%     
Vadakkumpadath 03.08.2017, 08:52
quelle

3 Antworten

5

Frxstream hat bereits eine ausgezeichnete Antwort . Darauf aufbauen und eine Perspektive bieten:

Das erste, was zu erkennen ist, ist, dass Versprechen "heiß" erstellt werden - das heißt, wenn Sie ein Versprechen-Objekt haben, ist es bereits "in Bearbeitung".

Das zweite wichtige Konzept ist, dass await wie eine "asynchrone Wartezeit" ist - das heißt, es unterbricht die Ausführung der Funktion, bis diese Zusage abgeschlossen ist.

Also ruft die serial -Funktion sleep auf, erhält ein Versprechen zurück und wartet dann (asynchron) darauf, dass dieses Versprechen abgeschlossen wird. Nachdem das Versprechen 3 Sekunden später abgeschlossen wurde, ruft serial erneut sleep auf, erhält ein Versprechen zurück und wartet dann (asynchron) darauf, dass dieses Versprechen abgeschlossen wird. Nachdem dieses Versprechen 3 Sekunden später abgeschlossen wurde, wird serial abgeschlossen.

Die Funktion parallel ruft sleep auf und speichert ihr Versprechen in a , ruft dann sleep auf und speichert ihr Versprechen in b und wartet dann (asynchron) auf den Abschluss von a . Nachdem a 3 Sekunden später abgeschlossen wurde, wartet parallel (asynchron) auf die Ausführung von b . Nachdem b praktisch sofort abgeschlossen wurde, wird parallel abgeschlossen.

    
Stephen Cleary 03.08.2017, 14:16
quelle
6

Es ist klarer, wenn Sie Ihre Funktion serial wie folgt schreiben:

%Vor%

Hier können Sie deutlich sehen, dass in der Funktion serial der zweite sleep() nur aufgerufen wird, nachdem der erste sleep() abgeschlossen wurde, während er in parallel sofort aufgerufen wird, bevor der erste abgeschlossen ist Es wartet auf beide, um abzuschließen. Obwohl sie funktionell identisch aussehen, sind sie subtil verschieden.

    
Frxstrem 03.08.2017 09:02
quelle
3

Da die sleep() -Funktion eine synchrone Funktion ist, gibt sie nur eine asynchrone Versprechung zurück, zB:

%Vor%

In parallel() , die beiden sleep() synchronisieren zwei Versprechen, sie warten auf ihre Auflösung, es wird ungefähr 3s dauern.

In serial() bedeuten die beiden await sleep() jedoch, dass die zweite sleep() -Versprechung warten muss, bis die erste sleep() aufgelöst wurde, also werden es ungefähr 6s sein.

    
JiangangXiong 03.08.2017 09:24
quelle