Concurrency 不同的F#并发方法之间的关系是什么
我最近学习了F#异步工作流,这是F#并发的一个重要特性。让我困惑的是,有多少种方法可以在F#中编写并发代码?除了F#之外,我还读过一些关于F#并发性的博客,我知道一些事情,比如背景工作者;IAsyncResult;如果在本地机器上编程,则F#中存在碎片内存并发;如果在分布式系统上编程,则存在消息传递并发性。但我真的不确定这些技术之间的关系是什么,以及如何对它们进行分类。我知道这是一个相当“大”的问题,不能用一两句话来回答,所以如果有人能给我具体的答案或推荐一些有用的参考资料,我将不胜感激。我对F#也相当陌生,所以我希望能有更多的答案来补充这一点:) 首先,您需要区分.NET类(可以从任何.NET语言中使用)和F#处理异步操作的独特方式。在您提到的第一种情况下,除其他情况外,您有:Concurrency 不同的F#并发方法之间的关系是什么,concurrency,f#-async,Concurrency,F# Async,我最近学习了F#异步工作流,这是F#并发的一个重要特性。让我困惑的是,有多少种方法可以在F#中编写并发代码?除了F#之外,我还读过一些关于F#并发性的博客,我知道一些事情,比如背景工作者;IAsyncResult;如果在本地机器上编程,则F#中存在碎片内存并发;如果在分布式系统上编程,则存在消息传递并发性。但我真的不确定这些技术之间的关系是什么,以及如何对它们进行分类。我知道这是一个相当“大”的问题,不能用一两句话来回答,所以如果有人能给我具体的答案或推荐一些有用的参考资料,我将不胜感激。我对F
:这主要用于Windows窗体的第一个.NET版本,不再推荐使用System.ComponentModel.BackgroundWorker
:这也是一个由几个类(也是任务)实现的旧.NET接口,但我通常不直接使用它System.IAsyncResult
<> >代码> Windows .Fask.IasycCurry:另一个接口,但仅用于Windows存储应用程序。大多数情况下,您直接将其转换为任务,因此您不必太担心它
:这是现在处理.NET异步和并行(使用并行任务库)操作的推荐方法。这是C#async/await关键字背后隐藏的力量,这些关键字只是将延续传递给任务的语法糖System.Threading.Tasks.Task
因此,现在有了独特的方式:异步工作流和MailboxProcessor。可以粗略地说,前者对应并行,而后者处理并发
:这只是一个处理异步的计算表达式(也称monad):在后台运行的操作,以防止阻塞UI线程或并行操作,从而在多核系统中获得最大性能 它或多或少相当于C#async/await,但我们F#fans喜欢认为它是一个更优雅的解决方案,因为它使用了一种更通用、更灵活的机制(计算表达式),可以对其进行调整,例如,甚至。正如Thomas Petricek解释的那样,它还有其他优势 在异步工作流中,大多数情况下,您将使用F#Core库中的异步工作流
中的方法或.NET类的扩展(如Control.Async
)。如有必要,您还可以直接与.NET任务(WebRequest.AsyncGetResponse
和Async.AwaitTask
)交互,甚至可以使用Async.startask
轻松创建自己的异步操作 要了解有关异步工作流的更多信息,您可以咨询、the Progressional或Async.StartWithContinuations
:设计用于处理并发性,即多个进程同时运行,通常需要共享一些信息。当多个线程试图同时写入一个变量时,防止内存损坏的传统.NET方法是lock语句。除了functional style更喜欢使用不可变值这一事实之外,内存锁的正确使用非常复杂,并且可能会带来高性能的损失。因此,Control.MailboxProcessor
使用类似于Erlang的基于消息(或基于参与者)的方法来实现并发 我自己并没有太多地使用过MailboxProcessor
,但要了解更多信息,您可以查看或下载MailboxProcessor
我希望这有帮助!如果有人认为这个答案不完全正确,请随意编辑
干杯 有没有其他语言使用类似的技术,比如F#async wkfI,我不知道还有多少其他语言,所以我不确定,但显然所有现代语言都包含了处理异步的基本工具。如上所述,Erlang有代理,EcmaScript 7可能会从C#合并async/await,而Go有本机通道。Haskell中的Control.Concurrent.Async库以类似于F#的方式使用monad,Clojure具有使用通道的core.Async。大多数方法背后的主要思想是,使用不可变数据可以更容易地对异步操作进行推理。