Sagen wir, ich wollte eine Webseite scrappen und einige Daten extrahieren. Ich würde wahrscheinlich so etwas schreiben:
%Vor% Das let!
teilt F # mit, dass der Code in einem anderen Thread ausgeführt werden soll. Anschließend binden Sie das Ergebnis an eine Variable und fahren mit der Verarbeitung fort. Das obige Beispiel verwendet zwei let-Anweisungen: eine, um die Antwort zu erhalten, und eine, um alle Daten zu lesen, sodass mindestens zwei Threads erzeugt werden (bitte korrigiere mich, wenn ich falsch liege).
Obwohl der obige Workflow mehrere Threads erzeugt, ist die Reihenfolge der Ausführung seriell, da jedes Element im Workflow vom vorherigen Element abhängt. Es ist nicht wirklich möglich, Elemente weiter unten im Workflow auszuwerten, bis die anderen Threads zurückkehren.
Gibt es einen Vorteil, mehr als ein let!
im obigen Code zu haben?
Wenn nicht, wie müsste dieser Code geändert werden, um mehrere let!
-Anweisungen zu nutzen?
Der Schlüssel ist, dass wir nicht neue Threads erzeugen. Während des gesamten Arbeitsablaufs werden 1 oder 0 aktive Threads vom ThreadPool verbraucht. (Eine Ausnahme, bis zum ersten '!', Läuft der Code auf dem Benutzer-Thread, der eine Async.Run gemacht hat.) "Let!" Lässt einen Thread los, während die Async-Operation auf See ist, und nimmt dann einen Thread vom ThreadPool auf, wenn die Operation zurückkehrt. Der (Performance-) Vorteil ist weniger Druck gegen den ThreadPool (und natürlich ist der Hauptnutzervorteil das einfache Programmiermodell - eine Million Mal besser als all die BeginFoo / EndFoo / Callback-Sachen, die Sie sonst schreiben).
Siehe auch Ссылка
Ich habe eine Antwort geschrieben, aber Brian hat mich dazu gedrängt. Ich stimme ihm vollkommen zu.
Ich möchte hinzufügen, dass, wenn Sie synchronen Code parallelisieren möchten, das richtige Werkzeug PLINQ ist, nicht asynchrone Workflows, wie .
Tags und Links f# asynchronous async-workflow