用于并发编程的.NET语言

这可能是其他人看到的问题,但我正在尝试找到一种可以在.net平台上运行的并行编程(或支持语言)的语言。 我一直在erlang中进行侧面开发以了解语言,并且喜欢获得稳定的并发甚至分布式系统是多么容易。它引导我使用scala,它也有一个很好的系统使用actor,但scala.net目前似乎没有这个功能(当然这是一个并发系统与分布式系统)。我看过的两种.net语言是Axum和F#。 这些是我唯一的选择吗?还有其他人吗?而且,如果他们是唯一的选择,每个的优点/缺点是什么?     
已邀请:
Axum是一个研究项目。一个真正的研究项目,只有它的想法才会最终产品。 (与整体产品化的F#不同。)我甚至不确定许可证是否允许使用它来开发生产应用程序。 F#是个不错的选择。 Clojure也可以在CLI上运行,也是一个不错的选择。 Scala的CLI端口目前正在复活(实际上是微软的官方资金),而Scala的Actor库(内置的一个,以及Akka)都非常好。 关于@ wmeyer上面的评论:Scala本身没有任何分布式编程的规定。 (Clojure也没有。)两者通常都依赖于为此目的而存在的无数Java框架,例如Terracotta。但是,Akka确实有用于分布式编程的Remote Actors,而Akka在很大程度上与内置的Scala Actor库API兼容,可以实现平滑过渡。 Erlang会很酷。 Kresten Krab Thorup目前正在开发Erjang,这是JVM上的一个Erlang实现,他有一些非常令人印象深刻的结果:在HotSpot上运行,Erjang与BEAM相比,有时甚至更好。例如,在具有10000个进程的着名过程环基准中,Erjang启动的速度仅比BEAM慢,但是当你重复运行几次并且JIT启动时,它会在大约3次运行后超过BEAM(并且好奇地,BEAM在4次运行后开始减速)。 我很确定你可以在DLR上构建一个“#rlang”和同样表现良好的TPL。     
我实际上正在使用F#来同时执行并发和分布式编程。我认为它运作良好。联合类型可以轻松定义静态类型的消息。 .NET序列化对我们来说太慢了,但是使用自定义解析器和更粗略的组合器替换它很容易,现在性能已经足够好了。异步工作流程和邮箱处理器可以轻松地传递消息。类型推断意味着我的整个代码库很小并且易于维护。     
我认为Jörg已经回答了你关于Axum的问题(我对此并不了解),所以我只想添加一些关于F#的东西 - 有一点需要注意的是F#并不是真正的并发语言。它只是有很好的并行开发库。最值得注意的选择是: 任务并行库和PLINQ也可以在C#中使用,但在F#中可能看起来更好一点,特别是如果你使用不可变数据类型。在.NET的并行编程中使用这两个有一些很好的F#示例,我写了一篇关于F#版本的博客文章。 异步工作流本质上不是为并发编程而设计的 - 它们允许您编写一般的非阻塞代码(这在并发编程中非常有用),并且它们允许您编写可以启动和管理的计算。您可以将它们用于: 使用
StartChild
方法的基于任务的并行性(有点像任务并行库) 使用
Async.Parallel
进行数据并行计算 _ 使用F#中的
MailboxProcessor
类型进行基于代理的编程允许您使用与Erlang非常相似的消息传递并发。它基于异步工作流,为您提供一些好处(例如,等待消息是非阻塞的)。 总之,我认为为您的任务选择合适的并行编程模型比编码它的语言更重要 - 只要该语言为您提供足够的能力来编码编程模型。在这种情况下,编程模型比语言更能塑造您的思维。 Axum基于actor(消息传递)模型,因此我认为通过一些努力,您可以将F#代理包装成与Axum API非常相似。     
从.NET 4.5开始,您可以使用C#async / await。我试图用async / await解释一个线程安全的,基于actor的设计。 AsyncWcfLib旨在帮助创建并发或分布式系统。     

要回复问题请先登录注册