泛函编程(20)-泛函库设计-Further Into Parallelism

  • 时间:
  • 浏览:2

1、"the quick fox".split(' ').size >>> 把字符串分解成文字并计算数量

3、pll: Par[List[List[A]]] = sequence(lpl)

这两步还都都能不能分十个 函数来实现:

没办法 flatMap,join,map之间有没办法 哪有几次数学关系呢?

例:函数f: (a: A) => a + 10:List(1,2,3).map(asyncF(f))=List(Par(1+10),Par(2+10),Par(3+10)),哪有几次Par是并行运算的。但它们的运算结果须要要是函数sequence来读取。当我们从以上分析还都都能不能得出sequence的类型款式:

1. f: A => B >>> 当我们须要把这名 函数转成并行运算:List[Par[B]]

4、map(pll){ a => a.flatten } >>> Par[List{A]]

当我们再看看现在所有的组件函数否是足够应付所有现象图片,还需不须要增加什么都有有基本组件,这也是开发十个 函数库须要走的过程;这要是十个 不断更新的过程。

还都都能不能看出当我们提交的callable内部内部结构是十个 run par,这名 run会再提交十个 callable但是 锁定get。外面的callable须要听候内部内部结构callable的get锁定完成。什么都有这名 fork实现是须要十个 程序的。原困程序池无法再为内部内部结构callable提供程序一句话,没办法 外面的callable就会处于永远听候中形成死锁。后边的parMap函数会按照List的长度分解出同等数量的并行运算,运行都是造成死锁吗?原困程序池都是 固定数量程序一句话,答案而否是定的:原困并行运算数量大于程序数,没办法 运算会分批进行:后边的运算还都都能不能听候前面的运算完成后释放出程序后继续运行,这里重点是前面的运算始终是还都都能不能完成的,什么都有不必造成死锁。

在上节当我们介绍了asyncF,它的类型款式是要是的:asyncF(f: A => B): A => Par[B],从类型款式(type signature)分析,asyncF函数的功能是把十个 普通的函数 A => B转成A => Par[B],Par[B]是十个 并行运算。也要是说asyncF还都都能不能把十个 输入参数A的函数变成十个 同样输入参数A的并行运算。asyncF函数还都都能不能把List[A],一串A值,按照函数A => B变成List[Par[A]],即一串并行运算。

在前面当我们无法用map来实现choice,原困类型不匹配。加了十个 join函数,又原困map元素类型不匹配,又不行。现在看来flatMap恰恰是当我们须要处置choice的组件,但是 flatMap能更抽象一层,连choiceN都同时处置了。值得注意的是当我们在以上处置现象图片的过程中一再提及类型匹配,这恰恰体现了泛函编程要是函数解题的过程。

2、lpl: List[Par[List[A]]] = as.map( asyncF( a => if(f(a)) List(a) else List()))

1、lp: List[Par[B]] = l.map(asyncF(f))

现在还都都能不能用map来实现choice了吧。但是 ,map是针对元素A来操作的,ifTrue和ifFalse都是 Par[A],还无法使用map。那就先放放吧。

2、List(A,B,C) >>> A.size + B.size + C.size >>> 把List里的文字数积合。

2、pl: Par[List[B]] = sequence(lp) >>> parMap

再做个新的习题:用并行运算最好的依据Filter List:

相信当我们对泛函编程的这名 数学解题模式原困有了一定的了解。

parMap按List[A]产生了一串并行运算的函数f。当我们还都都能不能从类型匹配着手一步一步推导:

2. g: List[B] => B

1、asyncF( a => if(f(a)) List(a) else List() )  >>> Par[List[A]]

既然当我们能在十个 并行运算中选折 ,没办法 能在N个并行运算中选折 都是 能更抽象吗?

现在有个新现象图片:原困十个 并行运算的运行依赖要是并行运算的结果,应该何如处置?先看看现象图片的类型款式:

再做十个 计算字数的练习:用并行运算最好的依据来计算List里的文字数。当我们尽量用共性的最好的依据来通用化解答。原困文字是以List装载的活,类型要是:List[String],举个实例:List("the quick fox","is running","so fast")。当我们还都都能不能分两步处置:

当我们还都都能不能看一遍现在choice是个最基本组件了。为了处置十个 现象图片就创造十个 新的组件都是 泛函编程的风格。应该是用什么都有有更基本的组件组合成十个 描述这名 现象图片的函数,那才是当我们要采用的风格。当我们应该试着用十个 函数能把Par[Par[A]]变成Par[A],原困就还都都能不能用map了:

    上两节当我们建了十个 并行运算组件库,实现了什么都有有基本的并行运算功能。到现在这名 阶段,编写并行运算函数原困还都都能不能和数学代数解题相近了:当我们了解了现象图片需求,但是 从类型匹配入手逐步产生题解。下面当我们再多做有几次练习吧。

ppa: Par[Par[A]], 原困 run(es)(ppa).get 得到 pa: Par[A], 再run(es)(pa) >>> Future[A]。 Par[A] = es => Future[A],不就处置现象图片了嘛:

在前面当我们要是提过现在的fork实现最好的依据原困使用固定数量程序池一句话有原困造成锁死:

 当我们还是从类型匹配着手一步步推导: