为什么函数式语言被认为是多线程环境的福音?

Bil*_*eal 9 multithreading functional-programming

我听到很多关于函数式语言的知识,以及它们如何很好地扩展,因为函数周围没有状态; 因此,该功能可以大规模并行化.

然而,这对我来说没什么意义,因为几乎所有现实世界的实际程序都需要/有状态来照顾.我还发现有趣的是,大多数主要的缩放库,即M​​apReduce,通常都是用C或C++等命令式语言编写的.

我想听听功能性营地,我听到这种炒作来自......

Igo*_*kon 14

添加一个词是很重要的:"没有共享状态".

任何有意义的程序(用任何语言)都会改变世界的状态.但是(某些)功能语言使得无法同时从多个线程访问相同的资源.缺少共享状态使多线程安全.


cle*_*tus 7

诸如Haskell,Scheme等功能语言具有所谓的"纯函数".纯函数是一种没有副作用的函数.它不会修改程序中的任何其他状态.根据定义,这是线程安全的.

当然,您可以用命令式语言编写纯函数.您还可以找到Python,Ruby甚至C#等多范式语言,您可以在其中执行命令式编程,函数式编程或两者兼而有之.

但是Haskell(等)的观点是你不能写一个非纯函数.嗯,这不是严格正确的,但它大多是真的.

类似地,许多命令式语言具有不可变对象的原因大致相同.不可变对象是一旦创建状态就不会改变的对象.根据定义,不可变对象是线程安全的.


Chu*_*uck 6

你在谈论两件不同的事情并没有意识到这一点.

是的,大多数真实世界的程序都处于某个地方,但是如果你想进行多线程处理,那么该状态不应该在任何地方,实际上,它所在的位置越少越好.在功能程序中,默认情况下不具有状态,您可以准确地将状态引入您需要的位置,而不是其他地方.处理状态的那些部分不会像多线程那样容易,但由于程序的所有其余部分都没有副作用,因此执行这些部分的顺序无关紧要,这消除了并行化的巨大障碍.

  • @Billy ONeal——这不仅仅是编程风格。FP 翻转了编程模型。在命令式中,默认情况下大多数内容都是可变的,您必须付出额外的努力来避免突变。在 FP 中,默认情况下大多数内容都是不可变的,您必须努力使某些内容可变。这是思维和方法上 180 度的转变。 (2认同)
  • @Billy:[软件交易记忆](http://en.wikipedia.org/wiki/Software_transactional_memory) (2认同)