F#是功能语言的不良选择

时间:2010-05-21 08:50:24

标签: multithreading f# erlang

对我而言,我认为F#是一个糟糕的选择,因为它在幕后使用线程。对我而言,由于上下文切换等问题,线程太“沉重”。

我可以看到为什么Erlang是一个很好的选择,因为它使用了轻量级的过程。

我错了吗?

3 个答案:

答案 0 :(得分:23)

我不明白你在问什么。

F#不使用'幕后线程',或者至少不比任何.NET进程更多。实际上,F#的async工具使得编写不使用线程的非阻塞I / O程序变得更加容易(与具有更难的无线程/非阻塞编程模型的C#/ VB相比)。

(当然,通常你不只是挑选一个任意方面来比较两件事,然后决定'X比Y更好'。编程语言不仅仅是一个线程/流程模型。)

您可能喜欢阅读

http://blogs.msdn.com/dsyme/archive/2010/02/15/async-and-parallel-design-patterns-in-f-part-3-agents.aspx

最后三段值得引用:

  

实际上,很少有其他.NET或   支持基于JVM的语言   轻质反应剂根本 -   在早期的.NET中据说是   “不可能”,因为成本   线程。在这种背景下,F#的   在2007年整合了“async {...}”   可以看作有点像   应用语言的突破   设计 - 它允许轻量级,   组合异步编程和   在一个环境中的反应性因子   工业上接受和   可互操作的编程平台。   随着Axum语言原型   (对F#有影响力),F#   已经证明是异步的   语言特征是一种可行的方法   突破“我们这样做的僵局”   使线程轻量化或不“那个   目前bedevils工业运行时   系统设计。

     

F#异步编程可以看作是   实施恢复,和   这里有许多前兆,因为   示例OCaml分隔延续,   Haskell嵌入monadic   并发和论文强调了   关于恢复的重要性   并发。

     

您可以使用F#异步代理   Linux / Mono / Mac上的.NET 2.0,3.5,4.0   并在Silverlight上。的确,你可以   F#时甚至使用F#异步编程   被翻译成Javascript使用   WebSharper平台。享受!

答案 1 :(得分:12)

自2006年以来,erlang已经拥有了SMP,所以它也“在幕后使用线程”。 erlang中的进程和F#中的(AFAIK)异步任务都不对应于OS线程;两个运行时都在需要时使用线程,并在适当的时候使用更轻量级的机制。

答案 2 :(得分:10)

如果你想获得一些有用的反馈,你应该指定你感兴趣的场景。但是,函数式编程不是关于线程或进程 - 它更多的是表达算法和使用不同的编程模式,所以使用线程/进程是比较函数式语言的一个非常奇怪的标准。

最重要的是,在F#中,并发编程只是库的问题,有很多选择:

    Brian提到的
  • F#async 允许您实现轻量级消息传递并发
  • PLINQ 允许您编写声明性数据并行计算
  • 任务为您提供了一个细粒度的原语,用于并行执行大量小任务
  • 主题(很少使用)可让您完全控制更接近操作系统级别

另一方面,Erlang几乎迫使您使用单个库进行并发编程(该语言直接支持)。对于许多领域(例如电信应用)而言,这可能是一个不错的选择,但对于其他一些情况,它可能过于严格。

我并没有对Erlang说任何坏事 - 你当然可以使用它来编码许多其他更高级别的并发编程范例。我只是说将语言绑定到单个并发编程模型(并使用它来比较语言)通常是错误的方法。