gpt4 book ai didi

asynchronous - 为什么我不应该使用 F# 异步工作流来实现并行性?

转载 作者:行者123 更新时间:2023-12-03 12:42:49 26 4
gpt4 key购买 nike

我最近一直在学习 F#,对它易于利用数据并行性特别感兴趣。 data |> Array.map |> Async.Parallel |> Async.RunSynchronously idiom 似乎很容易理解和直接使用并从中获得真正的值(value)。

那为什么async是不是真的是为了这个? Donald Syme himself说 PLINQ 和 Futures 可能是更好的选择。我在这里读到的其他答案也同意这一点,并推荐 TPL。 (PLINQ 似乎与上述内置函数没有太大区别,只要您使用 F# Powerpack 获取 PSeq 函数即可。)

F# 和函数式语言对此很有意义,some applications async 取得了巨大的成功并行性。

那么为什么我不应该使用 async执行并行数据处理?写并行会失去什么 async代码而不是使用 PLINQ 或 TPL?

最佳答案

So why shouldn't I use async to execute parallel data processes?



如果你有极少数完全独立的非 async任务和大量内核,那么使用异步来实现并行性并没有错。但是,如果您的任务以任何方式依赖,或者您的任务多于核心,或者您插入使用 async代码太深入,那么您将在桌面上留下很多性能,并且可以通过为并行编程选择更合适的基础来做得更好。

请注意,您的示例可以使用 F# 中的 TPL 更优雅地编写:
Array.Parallel.map f xs

What am I going to lose by writing parallel async code instead of using PLINQ or TPL?



您失去了编写缓存遗忘代码的能力,因此将遭受大量缓存未命中,因此,所有内核都停止等待共享内存,这意味着多核上的可扩展性较差。

TPL 是建立在子任务应该与父任务在同一个核心上执行的想法之上的,因此,将受益于重用相同的数据,因为它在本地 CPU 缓存中很热。异步没有这样的保证。

关于asynchronous - 为什么我不应该使用 F# 异步工作流来实现并行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5327591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com