Concurrency 不同的F#并发方法之间的关系是什么

Concurrency 不同的F#并发方法之间的关系是什么,concurrency,f#-async,Concurrency,F# Async,我最近学习了F#异步工作流,这是F#并发的一个重要特性。让我困惑的是,有多少种方法可以在F#中编写并发代码?除了F#之外,我还读过一些关于F#并发性的博客,我知道一些事情,比如背景工作者;IAsyncResult;如果在本地机器上编程,则F#中存在碎片内存并发;如果在分布式系统上编程,则存在消息传递并发性。但我真的不确定这些技术之间的关系是什么,以及如何对它们进行分类。我知道这是一个相当“大”的问题,不能用一两句话来回答,所以如果有人能给我具体的答案或推荐一些有用的参考资料,我将不胜感激。我对F

我最近学习了F#异步工作流,这是F#并发的一个重要特性。让我困惑的是,有多少种方法可以在F#中编写并发代码?除了F#之外,我还读过一些关于F#并发性的博客,我知道一些事情,比如背景工作者;IAsyncResult;如果在本地机器上编程,则F#中存在碎片内存并发;如果在分布式系统上编程,则存在消息传递并发性。但我真的不确定这些技术之间的关系是什么,以及如何对它们进行分类。我知道这是一个相当“大”的问题,不能用一两句话来回答,所以如果有人能给我具体的答案或推荐一些有用的参考资料,我将不胜感激。

我对F#也相当陌生,所以我希望能有更多的答案来补充这一点:)

首先,您需要区分.NET类(可以从任何.NET语言中使用)和F#处理异步操作的独特方式。在您提到的第一种情况下,除其他情况外,您有:

  • System.ComponentModel.BackgroundWorker
    :这主要用于Windows窗体的第一个.NET版本,不再推荐使用

  • System.IAsyncResult
    :这也是一个由几个类(也是任务)实现的旧.NET接口,但我通常不直接使用它

  • <> >代码> Windows .Fask.IasycCurry:另一个接口,但仅用于Windows存储应用程序。大多数情况下,您直接将其转换为任务,因此您不必太担心它

  • System.Threading.Tasks.Task
    :这是现在处理.NET异步和并行(使用并行任务库)操作的推荐方法。这是C#async/await关键字背后隐藏的力量,这些关键字只是将延续传递给任务的语法糖


因此,现在有了独特的方式:异步工作流和MailboxProcessor。可以粗略地说,前者对应并行,而后者处理并发

  • 异步工作流
    :这只是一个处理异步的计算表达式(也称monad):在后台运行的操作,以防止阻塞UI线程或并行操作,从而在多核系统中获得最大性能

    它或多或少相当于C#async/await,但我们F#fans喜欢认为它是一个更优雅的解决方案,因为它使用了一种更通用、更灵活的机制(计算表达式),可以对其进行调整,例如,甚至。正如Thomas Petricek解释的那样,它还有其他优势

    在异步工作流中,大多数情况下,您将使用F#Core库中的
    Control.Async
    中的方法或.NET类的扩展(如
    WebRequest.AsyncGetResponse
    )。如有必要,您还可以直接与.NET任务(
    Async.AwaitTask
    Async.startask
    )交互,甚至可以使用
    Async.StartWithContinuations
    轻松创建自己的异步操作

    要了解有关异步工作流的更多信息,您可以咨询、the Progressional或

  • Control.MailboxProcessor
    :设计用于处理并发性,即多个进程同时运行,通常需要共享一些信息。当多个线程试图同时写入一个变量时,防止内存损坏的传统.NET方法是lock语句。除了functional style更喜欢使用不可变值这一事实之外,内存锁的正确使用非常复杂,并且可能会带来高性能的损失。因此,
    MailboxProcessor
    使用类似于Erlang的基于消息(或基于参与者)的方法来实现并发

    我自己并没有太多地使用过
    MailboxProcessor
    ,但要了解更多信息,您可以查看或下载


我希望这有帮助!如果有人认为这个答案不完全正确,请随意编辑


干杯

有没有其他语言使用类似的技术,比如F#async wkfI,我不知道还有多少其他语言,所以我不确定,但显然所有现代语言都包含了处理异步的基本工具。如上所述,Erlang有代理,EcmaScript 7可能会从C#合并async/await,而Go有本机通道。Haskell中的Control.Concurrent.Async库以类似于F#的方式使用monad,Clojure具有使用通道的core.Async。大多数方法背后的主要思想是,使用不可变数据可以更容易地对异步操作进行推理。