.NET语言用于并发编程

7
这可能是其他人已经看到的问题,但我正在尝试找到一种专为(或具有语言支持)并发编程设计的语言,可在.net平台上运行。
我一直在使用erlang进行侧面开发,以了解该语言,并喜欢如何轻松地获得稳定的并发甚至分布式系统。这使我想起了scala,它也使用了演员模型来构建一个不错的系统,然而scala.net目前似乎没有这个功能(尽管这是一个并发系统与分布式系统的区别)。我正在考虑的两种.net语言是Axum和F#。
这些是我唯一的选择吗?还有其他选择吗?如果这些是我唯一的选择,每种语言的优缺点是什么?

1
你的意思是,用哪种 .Net 语言构建分布式系统最好? - Steve Townsend
我认为你应该清楚地区分多线程系统(使用一台或多台处理器的一台机器)和分布式系统(使用多台机器)。Erlang适用于这两种类型的系统,而Scala适用于多线程系统,但不太适合构建分布式系统(据我所知)。 - wmeyer
@wmeyer 这是一个很好的观点,尽管最好的方法是像Erlang一样,它并不真正关心这个问题,并且可以在多进程到多系统设置之间移动而不需要太多的代码更改。但是知道Scala在分布式系统方面表现不佳也是很好的,我之前并不知道。 - Mike
1
不要忘记:坚持使用不可变类型+PFX(即System.Threading.Tasks + System.Collections.Concurrent)在.NET语言中是可用的。 - Richard
我认为这个问题已经足够具体,并且答案也足够详细,应该被豁免不受“不具建设性”的关闭理由的影响。 - Bill the Lizard
4个回答

6
Axum是一个研究项目。一个真正的研究项目,只有其中的想法最终会成为产品。(不像F#,它作为整体被产品化了) 我甚至都不确定许可证是否允许使用它来开发生产应用程序。
F#是一个很好的选择。
Clojure也可以在CLI上运行,也是一个不错的选择。
Scala的CLI端口目前正在复活过程中(实际上还得到了微软的官方资助),Scala的Actor库(内置和Akka)非常不错。
关于@wmeyer上面的评论: Scala本身没有任何分布式编程的规定。(Clojure也没有) 两者通常依赖于存在的Java框架,如Terracotta。然而,Akka具有远程Actor以进行分布式编程,并且Akka在很大程度上与内置的Scala Actor库兼容,这允许平稳过渡。
Erlang可能很酷。Kresten Krab Thorup目前正在开发Erjang,这是一个在JVM上实现的Erlang,并且他取得了一些非常出色的结果:在HotSpot上运行,Erjang与BEAM可比地扩展,有时甚至更好。例如,在拥有10000个进程的(in)famous process-ring基准测试中,Erjang启动只比BEAM慢一点,但当您多次重复运行并且JIT启动后,它在大约3次运行后超过BEAM(奇怪的是,BEAM在第4次运行后开始变慢)。
我相信您可以在DLR和TPL上构建一个性能同样好的"#rlang"。

3

我目前正在使用F#进行并发和分布式编程,效果非常好。联合类型使得定义静态类型的消息变得容易。.NET序列化对我们来说太慢了,但是使用自定义解析器和解析器组合器替换它很容易,性能现在足够好了。异步工作流和邮箱处理器使得轻松传递消息变得容易。类型推断意味着我的整个代码库都非常小且易于维护。


+1:非常同意这里。我没有写过需要分布式应用程序的任何东西,但是我使用邮箱处理器完成的所有工作都很轻松。如果OP想要一个在.NET框架上运行的好语言来编写并发应用程序,那么很难击败F#。 - Juliet

2
我认为Jörg已经回答了你有关Axum的问题(而我对此并不了解),因此我只想补充一些关于F#的事情——需要注意的是,F#并不是一个真正的并发语言,它只是具有进行并行开发的优秀库。最值得注意的选项包括:
  • 任务并行库(Task Parallel Library)PLINQ也可以在C#中使用,但是如果您使用不可变数据类型,可能会在F#中看起来更好。在Parallel Programming with .NET中有一些不错的F#示例,我也写了一篇关于F#版本的博客文章

  • 异步工作流程不仅仅是为并发编程而设计的 - 它们允许您一般地编写非阻塞代码(这在并发编程中非常有用),并且允许您编写可以启动和管理的计算。您可以使用它们进行:

    • 基于任务的并行处理(有点像任务并行库),使用StartChild方法
    • 使用Async.Parallel进行数据并行计算
      _
  • 代理程序设计使用F#中的MailboxProcessor类型允许您使用类似于Erlang的消息传递并发。它基于异步工作流程,这给您带来了一些好处(例如等待消息是非阻塞的)。
总之,我认为选择适合您任务的正确并行编程模型比用于编码的语言更重要 - 只要语言提供足够的能力来编码编程模型。在这种情况下,编程模型比语言更能塑造您的思维。Axum基于Actor(消息传递)模型,因此我认为只要付出一些努力,您就可以将F#代理包装成看起来非常类似于Axum API的形式。

0

自 .NET 4.5 起,您可以使用 C# 的 async/await。我尝试使用 async/await 来解释一个线程安全的、基于actor的设计。 AsyncWcfLib 旨在帮助创建并发或分布式系统。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接