我最近一直在学习 F#,对其轻松利用数据并行性特别感兴趣。这data |> Array.map |> Async.Parallel |> Async.RunSynchronously
习语似乎很容易理解、易于使用并从中获得真正的价值。
那么为什么会这样呢async
真的不是为了这个吗?唐纳德·赛姆本人 http://blogs.msdn.com/b/dsyme/archive/2007/10/11/introducing-f-asynchronous-workflows.aspx说 PLINQ 和 Futures 可能是更好的选择。我在这里读到的其他答案也同意这一点,并推荐 TPL。 (PLINQ 看起来与上面的内置函数没有太大区别,只要您使用 F# Powerpack 来获取PSeq
功能。)
F# 和函数式语言对此非常有意义,并且一些应用程序 http://www.langnetsymposium.com/2009/talks/21-AmanderLauter-FSharpConcurrency.html取得了巨大的成功async
并行性。
So why 不应该 I use async
执行并行数据处理?写并行我会失去什么async
代码而不是使用 PLINQ 或 TPL?
那么为什么我不应该使用 async 来执行并行数据处理呢?
如果你有一小部分完全独立的非async
任务和大量核心,那么使用异步来实现并行性没有任何问题。但是,如果您的任务以任何方式相互依赖,或者您的任务多于核心,或者您推动使用async
深入代码,那么您将失去很多性能,并且可以通过选择更合适的并行编程基础来做得更好。
请注意,您的示例可以使用 F# 中的 TPL 编写得更加优雅:
Array.Parallel.map f xs
通过编写并行异步代码而不是使用 PLINQ 或 TPL,我会失去什么?
您失去了编写缓存无关代码的能力,因此,将遭受大量缓存未命中,因此,所有内核都会停止等待共享内存,这意味着多核上的可扩展性很差。
TPL 的构建理念是,子任务很有可能在与其父任务相同的核心上执行,因此,将受益于重用相同的数据,因为这些数据在本地 CPU 缓存中会很热。异步则没有这样的保证。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)