dag*_*da1 1 erlang f# multithreading
对我来说,我认为F#是一个糟糕的选择,因为它在幕后使用线程.对我而言,由于上下文切换等问题,线程太"重".
我可以看到为什么Erlang是一个很好的选择,因为它使用轻量级的过程.
我错了吗?
Bri*_*ian 23
我不明白你在问什么.
F#不使用"幕后的线程",或者至少不会使用任何.NET进程.实际上,F#的async工具使得编写不使用线程的非阻塞I/O程序变得更容易(与具有更难的无线程/非阻塞编程模型的C#/ VB相比).
(当然,通常你不只是挑选一个任意方面来比较两件事,然后决定'X比Y更好'.编程语言不仅仅是一个线程/流程模型.)
你可能喜欢阅读
最后三段值得引用:
实际上,很少有其他支持轻量级反应代理的基于.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#允许您实现轻量级消息传递并发另一方面,Erlang几乎迫使您使用单个库进行并发编程(该语言直接支持).对于许多领域(例如电信应用)而言,这可能是一个不错的选择,但对于其他一些情况,它可能过于严格.
我并没有对Erlang说任何坏事 - 你当然可以使用它来编码许多其他更高级别的并发编程范例.我只是说将语言绑定到单个并发编程模型(并使用它来比较语言)通常是错误的方法.