Frage

Ich habe ein paar Sachen in c # geschrieben, die gleichzeitig Code ausführt, so dass die starke Nutzung der Task Parallel Library (Aufgabe und Zukunft Fortsetzung Ketten).

Ich bin Portierung jetzt dies zu F # und ich versuche, die Profis, um herauszufinden und Nachteile der Verwendung von F # Async gegen die Konstrukte in der TPL-Workflows. Ich bin Neigung in Richtung TPL, aber ich denke, es könnte so oder so gemacht werden.

Hat jemand Tipps und Weisheit über gleichzeitige Programme in F # zu schreiben zu teilen?

War es hilfreich?

Lösung

Der Name ziemlich fasst den Unterschied: asynchron Programmierung vs. parallel Programmierung. Aber in F # können Sie mischen und anpassen.

F # Asynchronous Workflows

F # Asynchron-Workflows sind hilfreich, wenn Sie Code ausführen asynchron haben wollen, dass eine Aufgabe beginnt und nicht um für das Endergebnis warten. Die häufigste Verwendung dieser ist IO-Operationen. Nachdem der Thread in einer Warteschleife für Ihre Festplatte warten sitzen Schreiben verschwendet Ressourcen zu beenden.

Wenn Sie die Schreiboperation asynchron beginnen Sie den Thread aussetzen kann und habe es später durch ein Hardware-Interrupt aufgeweckt.

Task-Bibliothek

Parallel

Die Parallel Library Aufgabe in .NET 4.0 abstrahiert die Vorstellung von einer Aufgabe - wie eine MP3-Decodierung, oder einige Ergebnisse aus einer Datenbank zu lesen. In diesen Situationen wollen Sie tatsächlich das Ergebnis der Berechnung und irgendwann in der Zeit später warten auf das Ergebnis der Operation. (Durch die .RESULT Eigenschaft zugreifen.)

Sie können ganz einfach mischen und diese Konzepte entsprechen. Wie in einem TPL Task-Objekt, das alle Ihrer IO-Operationen zu tun. Um die Programmierer haben Sie die Notwendigkeit, ‚Deal mit‘ dem extra Thread abstrahiert, aber unter der Decke Sie verschwenden Ressourcen.

Wie weisen Sie eine Reihe von F # Asynchron-Workflows erstellen und ausführen können sie parallel (Async.Parallel), aber dann müssen Sie für das Endergebnis warten (Async.RunSynchronously). Dies befreit Sie von benötigen, explizit alle Aufgaben beginnen, aber wirklich durchführen Sie nur die Berechnung parallel.

Nach meiner Erfahrung finde ich, dass die TPL nützlicher ist, weil ich in der Regel N Operationen parallel ausgeführt werden soll. F # Asynchron-Workflows ist jedoch ideal, wenn es etwas gibt, auf ‚hinter den Kulissen‘ wird wie ein reaktives Mittel oder Mailbox-Typ Sache. (Sie etwas senden eine Nachricht, es verarbeitet sie und sendet sie zurück.)

Ich hoffe, das hilft.

Andere Tipps

4,0 Ich würde sagen:

  • Wenn Ihre Funktion sequentiell ist, verwenden Async-Workflows. Sie sind einfach besser lesen.
  • Verwenden Sie die TPL für alles andere.

Es ist auch möglich, zu mischen und anzupassen. Sie haben Unterstützung hinzugefügt einen Workflow als Aufgabe für den Betrieb und die Schaffung von Aufgaben, die die Asynchron folgen Start / Ende Muster mit TaskFactory.FromAsync das TPL-Äquivalent von Async.FromBeginEnd oder Async.BuildPrimitive.

let func() =
    let file = File.OpenRead("foo")
    let buffer = Array.zeroCreate 1024
    let task1 = Task.Factory.FromAsync(file.BeginRead(buffer, 0, buffer.Length, null, null), file.EndRead)
    task1.Start()

    let task2 = Async.StartAsTask(file.AsyncRead(1024))
    printfn "%d" task2.Result.Length

Es ist auch erwähnenswert, dass sowohl die Async Workflows Laufzeit und die TPL werden einen zusätzlichen Kernel primitiven (ein Ereignis) erstellen und verwenden WaitForMultipleObjects I / O-Abschluss zu verfolgen, anstatt Abschluss-Ports und Rückrufe verwenden. Dies ist unerwünscht, in einigen Anwendungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top