快速业务通道

使用GPars解决常见并发问题 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13

IF problem is small enough to solve directly   THEN solve it directly   ELSE {   Divide the problem in two or more sub-problems   Solve each sub-problem   Combine the results   }

使用GPars解决常见并发问题(5)

时间:2012-03-17 IBM Alex Miller

IF条件允许我改变每个任务的粒度。该风格的算法将生成一棵树,其中树叶由采用 THEN分支的任务定义。树中的内部节点是采用 ELSE分支的任务。每个内部节点必须等待(依赖于)其两个(或多个)子任务。fork/join 模型是专为这种算法设计的,即一棵依赖树中有大量任务在等待中。fork/join 中处于等待中的任务实际上不阻止线程。

GPars 允许我们通过执行 fork/join 任务来创建和执行 fork/join 算法,如清单 6 所示:

清单 6. max() (computeMax.groovy) 的并行 fork/join 实现

import static groovyx.gpars.GParsPool.runForkJoin   import groovyx.gpars.GParsPool   import groovyx.gpars.AbstractForkJoinWorker   @Grab(group=''org.codehaus.gpars'', module=''gpars'', version=''0.10'')   class Config {   static DATA_COUNT = 2**14    static GRANULARITY_THRESHHOLD = 128    static THREADS = 4  }   items = [] as List<Integer>   items.addAll(1..Config.DATA_COUNT)   Collections.shuffle(items)   GParsPool.withPool(Config.THREADS) {   computedMax = runForkJoin(1, Config.DATA_COUNT, items.asImmutable())    {begin, end, items ->     int size = end - begin     if (size <= Config.GRANULARITY_THRESHHOLD) {      return items[begin..<end].max()     } else { // divide and conquer      leftEnd = begin + ((end + 1 - begin) / 2)      forkOffChild(begin, leftEnd, items)      forkOffChild(leftEnd + 1, end, items)      return childrenResults.max() } }   println "expectedMax = ${Config.DATA_COUNT}"   println "computedMax = ${computedMax}"   }

注意,fork/join 在 groovyx.gpars.GParsPool类中拥有其特定的线程池。GParsPool与 GParsExecutorsPool共享多个常见功能,但拥有 fork/join 所特有的功能。要直接使用 fork/join,您必须使用带有一个任务闭包的 runForkJoin()方法或一个将 AbstractForkJoinWorker分为子类的任务类。

并行集合

Fork/join 提供一种不错的方式来定义和执行并行任务结构,特别是分而治之算法中的那些结构。不过,您可能已经注意到,上面的示例中涉及到相当多的繁文缛节。我必须定义任务闭包、确定合适的任务粒度、分离子问题、综合结果,等等。

理论上,我希望在更高抽象级别工作,即定义一个数据结构,然后并行对其执行常见操作,无需在每种情况下定义管理细节的低级别任务。

JSR 166y 维护更新指定为此指定一个高级接口,称为 ParallelArray。ParallelArray对一个数组结构提供常见的函数程序设计操作,这些函数通过一个 fork/join 池并行执行。

由于 API 的函数特性,传递一个函数(方法)给这些操作很有必要,这样就可以在 ParallelArray中的每个项目上执行它。JDK 7 仍在开发中的一项功能是对 λ 的支持,该功能允许开发人员定义和传递代码块。此时,JDK 7 中所含 ParallelArray的状态有待 λ 项目结果定夺。

使用GPars解决常见并发问题(6)

时间:2012-03-17 IBM Alex Miller

GPars 中的 ParallelArray

Groovy 完全支持将代码块定义为闭包并将它们

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号