目前的设置是这样的
array
|> Seq.map (fun item -> async { return f item})
|> Async.Parallel
|> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
问题是,这往往会创建太多线程并定期崩溃应用程序.
在这种情况下如何限制线程数(比如说,Environment.ProcessorCount)?
自 2018 年拉取请求以来,F# Core 中通过F# 文档的第二次重载提供了一个内置选项Async.Parallel
array
|> Seq.map (fun item -> async { return f item})
|> fun computations -> Async.Parallel(computations, maxDegreeOfParallelism = 20)
|> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
如果您想要并行化以数组(或任何序列)作为输入的 CPU 密集型计算,那么使用F# PowerPackPSeq中的模块(尽管仅在 .NET 4.0 上可用)可能是更好的主意。它提供了许多标准函数的并行版本。有关更多信息,您还可以查看使用 .NET 进行并行编程示例的F# 翻译。Array.xyz
解决您的问题的代码比使用工作流程要简单一些:
array |> PSeq.map f
|> PSeq.toArray
Run Code Online (Sandbox Code Playgroud)
这两个选项之间的一些区别是:
总之,如果您需要异步操作(例如 I/O),那么这Async是最好的选择。如果您有大量 CPU 密集型任务,那么PSeq可能是更好的选择(在 .NET 4.0 上)
| 归档时间: |
|
| 查看次数: |
1707 次 |
| 最近记录: |