我有一些用c#编写的执行并发代码的东西,大量使用任务并行库(Task and Future continuation chains).
我现在将其移植到F#,并试图找出使用F#Async工作流与TPL中的构造的优缺点.我倾向于TPL,但我认为无论哪种方式都可以.
有没有人有关于在F#中编写并发程序的提示和智慧?
我最近一直在学习F#,特别感兴趣的是它易于利用数据并行性.这个data |> Array.map |> Async.Parallel |> Async.RunSynchronously成语似乎很容易理解,直接使用并从中获得真正的价值.
那么为什么它async不是真正意图呢?Donald Syme本人表示,PLINQ和期货可能是更好的选择.我在这里读到的其他答案同意这一点以及推荐TPL.(PLINQ与上述内置函数似乎没什么不同,只要您使用F#Powerpack来获取PSeq函数.)
F#和函数式语言对此非常有意义,并且一些应用程序在async并行性方面取得了巨大成功.
那么为什么我不应该async用来执行并行数据流程呢?通过编写并行async代码而不是使用PLINQ或TPL,我将失去什么?
"Async.Parallel"结构真的有助于在多核系统上更快地进行计算吗?.NET TPL"任务"是否以某种方式涉及到这里?
open System;
let key = Console.ReadKey(true);
let start = System.DateTime.Now
let pmap f l = seq { for a in l do yield async {return f a} } |> Async.Parallel |> Async.RunSynchronously
let map f l = seq {for a in l do yield f a}
let work f l =
match key.KeyChar with
| '1' -> pmap f l
| '2' -> Seq.toArray (map f l)
| _ -> [||]
let result = work (fun x -> …Run Code Online (Sandbox Code Playgroud)