快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-13
作为一类对象四处传递,因此使用 Groovy 和 GPars 在这种函数式样下工作很自然。ParallelArray和 GPars 支持一组核心的函数运算符:

map reduce filter size sum min max

另外,GPars 在一个 GParsPool块内扩展集合,为我们提供构建于原语之上的其他并行方法:

eachParallel collectParallel findAllParallel everyParallel groupByParallel

可以将并行集合方法透明化,以便标准集合方法默认情况下并行运作。这将允许您传递一个并行集合给现有(非并行)代码库并按原样使用该代码。不过,考虑这些并行方法使用的状态仍然很重要,因为外部代码可能不保证必要的同步运作。

再看一下 清单 6中的示例,注意到,max()是一个已经在并行集合中提供的方法,因此没有必要直接定义和调用 fork/join 任务,如清单 7 所示:

清单 7. 使用 GPars ParallelArray 函数(computeMaxPA.groovy)

import static groovyx.gpars.GParsPool.runForkJoin   import groovyx.gpars.GParsPool   @Grab(group=''org.codehaus.gpars'', module=''gpars'', version=''0.10'')   class Config {   static DATA_COUNT = 2**14    static THREADS = 4  }   items = [] as List<Integer>   items.addAll(1..Config.DATA_COUNT)   Collections.shuffle(items)   GParsPool.withPool(Config.THREADS) {   computedMax = items.parallel.max()   println "expectedMax = ${Config.DATA_COUNT}"   println "computedMax = ${computedMax}"   }

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

时间:2012-03-17 IBM Alex Miller

使用 ParallelArray 的函数程序设计

现在假设我在一个库存系统中编写订单报告,计算过期的订单数以及这些订单的平均过期天数。我可以这么做:首先定义方法来确定订单是否过期(通过比较当前日期与到期日),然后计算今天与到期日之间的天数差额。

该代码的核心是使用核心的 ParallelArray方法计算所需数目的那一部分,如清单 8 所示:

清单 8. 充分利用并行函数运算符(orders.groovy)

GParsPool.withPool {   def data = createOrders().parallel.filter(isLate).map(daysOverdue)   println("# overdue = " + data.size())   println("avg overdue by = " + (data.sum() / data.size()))   }

这里我选取了一个订单列表,将其转化为一个 ParallelArray,仅保留那些 isLate返回值为真的订单,并计算了每个订单的映射函数,以将其转化为过期天数。然后我可以使用内置的聚合函数来获取过期天数的大小和总和并计算平均值。该代码可能与使用函数程序设计语言编写的那些很类似,不过它的额外优势在于该代码是自动并行执行的。

管理状态

任何时候要处理将由多个线程读写的数据时,您必须考虑如何管理该数据并协调更改。用 Java 语言和其他语言管理共享状态的主导范例包括由锁或其他关键节标记保护的可变状态。

出于多种原因,可变状态和锁容易出问题。锁意味着要整理代码中的依赖性,使开发人员对于执行路径和预期结果有理可循。但是,由于锁的多个方面未加以实施,因此看到低质量代码是很常见的,这些代码包含可见性、安全发布、竞争条件、死锁和其他常见并发弊病方面的问题。

一个更严重的问题是,即使您一开始使用两个在并发性方面得到正确编写的组件,也有可能在结合它们时生成新的意外错误。因此编写构建于可变状态和锁之上、且该状态和锁随系统增长仍然可靠的并发系统很难。

在接下来几节,我将展示跨系统中的线程管理和共享状态的三个范例。从根本上讲,这些范例可以(且是)构建于线程和锁的基底之上,但是它

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号