Parallel processing 使用函数方法和不可变数据结构的并行计数?

Parallel processing 使用函数方法和不可变数据结构的并行计数?,parallel-processing,functional-programming,immutability,purely-functional,Parallel Processing,Functional Programming,Immutability,Purely Functional,我听到并接受了突变和状态不利于并发的观点。但我很难理解正确的选择到底是什么 例如,在查看所有任务中最简单的任务时:计数,例如,在大量文档中计算单词。访问和解析文档需要一段时间,因此我们希望使用k线程或actor或任何并行抽象来并行执行 使用不可变的数据结构来实现这一点,正确但实用的纯函数方式是什么 只有当可变状态在多个线程之间共享以进行通信时,突变和状态才不利于并发性,因为很难对不纯净的函数和方法进行争论,这些函数和方法会悄悄地并行地丢弃一些共享内存 一种可能的替代方法是使用消息传递在线程/参与

我听到并接受了突变和状态不利于并发的观点。但我很难理解正确的选择到底是什么

例如,在查看所有任务中最简单的任务时:计数,例如,在大量文档中计算单词。访问和解析文档需要一段时间,因此我们希望使用k线程或actor或任何并行抽象来并行执行


使用不可变的数据结构来实现这一点,正确但实用的纯函数方式是什么

只有当可变状态在多个线程之间共享以进行通信时,突变和状态才不利于并发性,因为很难对不纯净的函数和方法进行争论,这些函数和方法会悄悄地并行地丢弃一些共享内存


一种可能的替代方法是使用消息传递在线程/参与者之间进行通信(就像在Akka中所做的那样),并在其上构建类似ApacheSpark的(“合理纯”)功能数据分析框架。众所周知,Apache Spark非常适合计算大量文档中的单词。

只有在多个线程之间共享可变状态以进行通信时,变异和状态才不利于并发,因为很难对不纯净的函数和方法进行争论,这些函数和方法会悄悄地并行破坏一些共享内存


一种可能的替代方法是使用消息传递在线程/参与者之间进行通信(就像在Akka中所做的那样),并在其上构建类似ApacheSpark的(“合理纯”)功能数据分析框架。众所周知,Apache Spark非常适合计算大量文档中的字数。

以功能方式分析数据集的一般方法是以某种有意义的方式对数据集进行分区,对于文档,您可以根据大小将其划分为多个部分。i、 e.四个螺纹意味着文件分为四部分

然后,线程或进程对数据集的每个部分执行其算法并生成输出。所有输出都收集在一起,然后合并。例如,对于单词计数,单词计数的集合按单词排序,然后使用查找相同的单词逐步完成每个列表。如果该单词出现在多个列表中,则计数相加。最后,输出一个包含所有单词总和的新列表

这种方法通常称为map/reduce。将文档转换为字数的步骤是“映射”,输出的聚合是“减少”

除了消除开销以防止数据冲突的优点外,函数方法还可以使编译器优化到更快的方法。并非所有语言和编译器都这样做,但由于编译器知道其变量不会被外部代理修改,因此可以对代码应用转换以提高其性能

此外,函数式编程允许像Spark这样的系统动态创建线程,因为更改的边界是明确定义的。这就是为什么您可以在Spark中编写单个函数链,然后在不必更改代码的情况下向它扔服务器。纯函数式语言可以以一种通用的方式做到这一点,使每个应用程序本质上都是多线程的


函数式编程之所以“热门”,其中一个原因是它能够透明、安全地实现多处理。

以函数方式分析数据集的一般方法是以某种有意义的方式对数据集进行分区,对于文档,您可以根据大小将其分为多个部分。i、 e.四个螺纹意味着文件分为四部分

然后,线程或进程对数据集的每个部分执行其算法并生成输出。所有输出都收集在一起,然后合并。例如,对于单词计数,单词计数的集合按单词排序,然后使用查找相同的单词逐步完成每个列表。如果该单词出现在多个列表中,则计数相加。最后,输出一个包含所有单词总和的新列表

这种方法通常称为map/reduce。将文档转换为字数的步骤是“映射”,输出的聚合是“减少”

除了消除开销以防止数据冲突的优点外,函数方法还可以使编译器优化到更快的方法。并非所有语言和编译器都这样做,但由于编译器知道其变量不会被外部代理修改,因此可以对代码应用转换以提高其性能

此外,函数式编程允许像Spark这样的系统动态创建线程,因为更改的边界是明确定义的。这就是为什么您可以在Spark中编写单个函数链,然后在不必更改代码的情况下向它扔服务器。纯函数式语言可以以一种通用的方式做到这一点,使每个应用程序本质上都是多线程的


函数式编程之所以“热门”,其中一个原因是它能够透明、安全地实现多处理。

谢谢!我知道可变数据结构的问题来自于共享它们,但我也对纯函数方法实际上会是什么样的更为理论化的问题感兴趣?如果我所拥有的只是函数和VAL,并且我想以这种方式实现“并行字计数”示例,那么我该怎么做呢?谢谢!我知道可变数据结构的问题来自于共享它们,但我也对纯函数方法实际上会是什么样的更为理论化的问题感兴趣?如果我所拥有的只是函数和VAL,并且我想以这种方式实现“并行字计数”示例,那么我怎么能拥有t