用于并发编程的.NET语言

时间:2010-09-22 23:25:55

标签: .net multithreading f# erlang axum

这可能是其他人看到的问题,但我正在尝试找到一种专为(或支持语言)并行编程而设计的语言,该语言可以在.net平台上运行。

我一直在erlang中进行侧面开发以了解语言,并且喜欢获得稳定的并发甚至分布式系统是多么容易。它引导我使用scala,它也有一个很好的系统使用actor,但scala.net目前似乎没有这个功能(当然这是一个并发系统与分布式系统)。我看过的两种.net语言是Axum和F#。

这些是我唯一的选择吗?还有其他人吗?而且,如果他们是唯一的选择,每个的优点/缺点是什么?

4 个答案:

答案 0 :(得分:6)

Axum是一个研究项目。一个真正的研究项目,只有它的想法最终会出现在产品中。 (与整体产品化的F#不同。)我甚至不确定许可证是否允许使用它来开发生产应用程序。

F#是个不错的选择。

Clojure也可以在CLI上运行,也是一个不错的选择。

Scala的CLI端口目前正在复活(实际上是微软提供的官方资金),而Scala的Actor库(内置的,以及Akka)都非常好。

关于@ wmeyer上面的评论:Scala本身没有任何分布式编程的规定。 (Clojure也没有。)两者通常都依赖于为此目的而存在的无数Java框架,例如Terracotta。但是,Akka 具有用于分布式编程的远程Actors,而Akka在很大程度上与内置的Scala Actor库API兼容,可以实现平滑过渡。

Erlang会很酷。 Kresten Krab Thorup目前正在开发Erjang,这是JVM上的一个Erlang实现,他有一些非常令人印象深刻的结果:在HotSpot上运行,Erjang与BEAM相比,有时甚至更好。例如,在具有10000个进程的着名过程环基准中,Erjang启动的速度仅比BEAM慢,但是当你重复运行几次并且JIT启动时,它会在大约3次运行后超过BEAM(并且好奇地,BEAM在4次运行后开始减速。)

我很确定你可以在DLR和同样出色的TPL上构建一个“#rlang”。

答案 1 :(得分:3)

我实际上正在使用F#来同时执行并发和分布式编程。我认为它运作良好。联合类型可以轻松定义静态类型的消息。 .NET序列化对我们来说太慢了,但是使用自定义解析器和更粗略的组合器替换它很容易,现在性能已经足够好了。异步工作流程和邮箱处理器可以轻松地传递消息。类型推断意味着我的整个代码库很小并且易于维护。

答案 2 :(得分:2)

我认为Jörg已经回答了你关于Axum的问题(我对此并不了解),所以我只想补充一些关于F#的事情 - 有一点需要注意的是F#并不是真的并发语言。它只是有很好的并行开发库。最值得注意的选择是:

  • 任务并行库 PLINQ 也可以在C#中使用,但在F#中可能看起来更好一些,特别是如果您使用不可变数据类型。在Parallel Programming with .NET中使用这两个有一些不错的F#示例,我写了关于F#版本的blog post

  • 异步工作流程不是本质上设计用于并发编程 - 它们允许您编写一般的非阻塞代码(这在并发编程中非常有用)它们允许您编写可以启动和管理的计算。您可以将它们用于:

    • 使用StartChild方法
    • 的基于任务的并行性(有点像任务并行库)
    • 使用Async.Parallel进行数据并行计算 _
  • 使用F#中的MailboxProcessor类型
  • 基于代理的编程允许您使用与Erlang非常相似的消息传递并发。它基于异步工作流,为您带来一些好处(例如,等待消息是非阻塞的)。

总之,我认为为您的任务选择正确的并行编程模型比用于编码它的语言更重要 - 只要语言给出你有足够的能力编码编程模型。在这种情况下,编程模型比语言更能塑造您的思维。 Axum 基于actor(消息传递)模型,因此我认为通过一些努力,您可以将F#代理包装成与Axum API非常相似。

答案 3 :(得分:0)

从.NET 4.5开始,您可以使用C#async / await。我尝试使用async / await解释线程安全actor based designAsyncWcfLib旨在帮助创建并发或分布式系统。