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

dag*_*da1 1 erlang f# multithreading

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

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

我错了吗?

Bri*_*ian 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中,由于线程的成本,它被称为"不可能".在这种情况下,2007年F#对"async {...}"的集成可以看作是应用语言设计的一些突破 - 它允许在工业上接受和可互操作的编程环境中实现轻量级,组合异步编程和反应代理.平台.随着Axum语言原型(对F#产生了影响),F#已经证明异步语言功能是一种可行的方法,可以突破"我们使线程轻量化与否"的僵局,这种方式目前困扰着工业运行时系统设计.

F#异步编程可以看作是恢复的实现,这里有许多前兆,例如OCaml分隔的连续,Haskell嵌入monadic并发和论文强调恢复在并发方面的重要性.

您可以在.NET 2.0,3.5,4.0,Linux/Mono/Mac和Silverlight上使用F#异步代理.实际上,当使用WebSharper平台将F#转换为Javascript时,您甚至可以使用F#异步编程.请享用!


Pet*_*ham 12

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


Tom*_*cek 10

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

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

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

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

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