泛函编程(19)-泛函库设计-Parallelism In Action

  • 时间:
  • 浏览:0

1、unit[A](a: A): Par[A] : 大伙儿硬生生的按照Par的类型款式造了一个多多Future实例,如果大伙儿才可不里能用Future.get的形式读取运算结果值。看看這個 例子:unit(42+1),在调用函数unit时不可能 传入参数是即时计算的,好多好多 在进入unit前不可能 完成了计算结果43。但会 人为的把這個 结果赋予Future.get,如果大伙儿就可不里能和真正的由ExecutorService返回的Future一样用同样的最好的办法读取结果。好多好多 说unit纯粹是一个多多改变格式的升格函数,没办法 任何其它作用。

看看结果:unit在主多应用程序 main运行,而async则在pool-1-thread-1這個 非主多应用程序 内运行。

没办法 大伙儿用例子来示范一下:

实现异步运算才是并行运算的第一步。并行运算顾名思义如果把一个多多大任务分解成几块较小任务但会 一并异步运算后再把结果结合起来。大伙儿用伪代码描述一下并行运算思路:

先用泛函最好的办法启动并行运算。不可能 大伙儿并行启动一个多多运算:

2、async[A](a: => A): Par[A]:這個 async函数把表达式a提交到主多应用程序 之外的如果多应用程序 。新的多应用程序 由ExecutorService提供,大伙儿无须理会,如果可不里能实现多应用程序 管理和并行运算组件库的松散耦合。不可能 async的传人函数是延后计算类型,好多好多 大伙儿可不里能把表达式a提交给如果多应用程序 去运算。

看来用以上最好的办法是可不里能得到并行运算的效果(10秒到5秒区别)。但大伙儿采用了串指令(imperative)最好的办法实现。当然大伙儿前要考虑用泛函最好的办法来实现并行运算的启动及结果抽取。

实际上大伙儿不可能 实现了两项最基本的函数:

在map2的实现里大伙儿人为地建了个Future[C]。但在建的过程中大伙儿运行了pa,pb的计算。不可能 大伙儿对pa或pb有运算超前要求语句,就前要计算每次运算所使用的时间。好多好多 Future[C]是符合pa,pb的运算要求的。

大伙儿先试着一并运算41+2,33+4一个多多计算:

    上节大伙儿讨论了并行运算组件库的基础设计,实现了并行运算最基本的功能:创建新的多应用程序 并提交一个多多任务异步执行。并行运算类型的基本表达形式如下:

一个多多以上并行运算可不里能通过map2来实现:

现在所有的计算有的是在不同的非主多应用程序 中运算的了,清楚了吧。