电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

用友U9知识-U9并行计算应用指南-new.docx

用友U9知识-U9并行计算应用指南-new.docx_第1页
1/13
用友U9知识-U9并行计算应用指南-new.docx_第2页
2/13
用友U9知识-U9并行计算应用指南-new.docx_第3页
3/13
.Net新特性-并行计算应用指南1.特性简介1.1.并行编程体系结构许多个人计算机和工作站都有两个或四个内核(即CPU),使多个线程能够同时执行。在不久的将来,计算机预期会有更多的内核。为了利用当今和未来的硬件,您可以对代码进行并行化,以将工作分摊在多个处理器上。过去,并行化需要线程和锁的低级操作。VisualStudio2010和.NETFramework4提供了新的运行时、新的类库类型以及新的诊断工具,从而增强了对并行编程的支持。这些功能简化了并行开发,使您能够通过固有方法编写高效、细化且可伸缩的并行代码,而不必直接处理线程或线程池。下图从较高层面上概述了.NETFramework4中的并行编程体系结构。图1、并行编程体系结构1.2.并行计算组件图2、并行计算组件NET4.0并行计算组件主要包括以下几个部分:1并行语言集成查询(PLINQ,ParallelLanguageIntegratedQuery),这是.NET3.0引入的LINQtoObject的换代“产品”,让查询操作可以并行执行。2任务并行库(TPL,TaskParallelLibrary):将开发并行程序的抽象级别从“线程(thread)”提升到“任务(Task)”,只需规定好计算机要执行的任务,然后由.NET去管理线程的创建和同步等问题。3同步的数据结构(CDS,CoordinationDataStructures):包括一组线程安全的常用数据结构,比如线程安全的队列、堆栈等,在并行程序中访问这些数据结构,可以不需要显式地使用lock。4任务调度器(TaskScheduler):负责任务的创建、执行、暂停等管理工作。5线程池:.NET4.0对原有的托管线程池功能进行了大幅度的增强,通过给其集成一个任务调度器,线程池中的线程可以高效地并行执行各种任务。上述五个组成部分当中,PLINQ是建立在TPL之上的,而TaskScheduler是并行计算的核心,是一个Runtime,它与线程池相集成,负责将任务分派给线程池中的各个线程执行。2.任务并行库2.1.数据并行数据并行是指对源集合或数组中的元素同时(即并行)执行相同操作的情况。System.Threading.Tasks.Parallel类中For和ForEach方法的若干重载支持使用强制性语法的数据并行。在数据并行操作中,将对源集合进行分区,以便多个线程能够同时对不同的片段进行操作。TPL支持通过System.Threading.Tasks.Parallel类实现的数据并行。此类提供for和foreach循环(VisualBasic中为For和ForEach)基于方法的并行实现。为Parallel.For或Parallel.ForEach循环编写循环逻辑与编写顺序循环非常类似。您不必创建线程或队列工作项。在基本的循环中,您不必采用锁。TPL将为您处理所有低级别工作。下面的代码示例演示一个简单的foreach循环及其并行等效项。当并行循环运行时,TPL将对数据源进行分区,以便循环能够同时对多个部分进行操作。在后台,任务计划程序将根据系统资源和工作负荷来对任务进行分区。如有可能,计划程序会在工作负荷变得不平衡的情况下在多个线程和处理器之间重新分配工作。附件:数据并行代码示例2.2.任务并行顾名思义,任务并行库(TPL)基于任务的概念。术语“任务并行”是指一个或多个独立的任务同时运行。任务表示异步操作,在某些方面它类似于创建新线程或ThreadPool工作项,但抽象级别较高。任务提供两个主要好处:系统资源的使用效率更高,可伸缩性更好。在后台,任务排队到ThreadPool,ThreadPool已使用登山等算法进行增强,这些算法能够确定并调整到可最大化吞吐量的线程数。这会使任务相对轻量,您可以创建很多任务以启用细化并行。为了补偿这一点,可使用众所周知的工作窃取算法提供负载平衡。对于线程或工作项,可以使用更多的编程控件。任务和围绕它们生成的框架提供了一组丰富的API,这些API支持等待、取消、继续、可靠的异常处理、详细状态、自定义计划等功能。出于这两个原因,在.NETFramework4中,任务是用于编写多线程、异步和并行代码的首选API。附件:任务并行代码示例2.3.并行指令生成图3、并行指令软件工程师使用Paralllel类编写的并行算法,经过编译器的处理,会全部转换为对Task类相应方法和属性的调用指令,这些指令被保存到编译好的程序集中。Task类的实例代表一个可以被并行执行的任务,任务(而不是线程!)是TPL实现并行计算的基本单位。2.4.任务并行库工作原理任务由线程负责执行,为了获取较高的性能,TPL使用线程池中的线程,并且使用了一个与线程池直接集成的“任务调度器(TaskScheduler)”来负责分派工作任务给线程,这个调度器使用的任务分派策略称为“Work-stealing”。图4、线程调度如图4所示,线程池中的每个线程都拥有一个专有的(本地的)任务队列,当线程创建任务(即Task类的实例)时,默认设置下,这些任务被放入了线程本地工作队列中。如果任务本身是通过调用ThreadPool.QueueUserWorkItem()添加的,则此任务会被添加到一个全局队列(globalqueue)中,这一全局队列就是图4中所示的“线程池任务队列”。以下是任务调度器实现任务调度的基本过程:当任务调度器开始分派任务时,它先检查一下创建此任务的线程是不是线程池中的线程(这种线程拥有一个本地的任务队列),如果不是,此任务被加入到线程池全局任务队列中,如果是,任务调度器检查此任务是否设置了TaskCreationOptions.PreferFairness标记,如果设置了,则此任务被加入到线程池全局任务队列中,否则,还是被放入到线程的本地队列中。当一个线程开始执行时,它优先搜索自己的专有任务队列,当此队列为空时,它才会去搜索全局任务队列。由此可见,这种调度策略实际上是其于优先级的,本地工作队列比全局队列拥有更高的优先级。上述这种默认的调度策略适用于绝大多数情况,但不可能是所有的情况,如果需要对线程本地队列和线程池全局队列中的任务一视同仁,在不改变调度策略的情况下(这个策略是由.NET为线程池所提供的默认调度器实现的,不可改),可以通过将需要“一视同仁”的Task任务直接放到线程池全局队列而不是线程本地队列中实现,其具体的实现方法就是在创建任务时,设置它的TaskCreationOptions.PreferFairness标记。提示:如果并行执行是通过Parallel类的Invoke、For和ForEach方法启动的,则不能为其指定TaskCreationOptions.PreferFairness标记,只有在显式创建Task类的代码中可以设置此标记。下一小节将介绍如何直接使用Task类进行基于“任务”的并行编程。3.一个应用实例实例包括3个实体,订单(Order)、订单明细(OrderDetail)和订单汇总(OrderTotal),其中订单组合订单明细。实例模拟U9单据列表操作,并更新公共资源(订单汇总),每张单据保存和更新订单汇总为一个完整事务,且每次单独开启一个数据库连接和事务。附件:应用代码实例4.U9的应用方案4.1.列表批量操作U9列表批量操作包括:提交、审核、弃审、删除,按单据为单位进行事务隔离,循环调用实体修改BP,触发实体的相应事件进行相应的业务逻辑处理。因为每张单据都是独立事务,完全符合并行计算特性。但U9的事务是通过BP调用初始化的,BP的上下文与当前线程相关,所以在并行计算环境下,首先需要解决多线程下,每个线程的BP上下文,以及平台上下问题。本文以库存管理模块的单据列表批量操作为例逐一进行讲解。4.1.1.调用并行接口U9单据列表操作都是UI调用一个后台BP,后台BP根据每张单据循环调用更新单据小BP,每个小BP是独立事务。所以鉴于次,我们把并行计算接口进程封装,并行接口封装进了UBF.System.dll,开发部只需要把小BP的实例集合传给并行接口方法:ListbpList=newList();bpList.Add(updateEntityOperation);ListresultDTOList=ParallelHelper.RunBP(bpList,ParallelOption.ConcurrencyRetry|ParallelOption.InitBPContext,newobject[]{"EntityKey"});foreach(IParallelResultdtoinresultDTOList){r.Add(newEntityBatchResult(dto.ID,dto.ErrorMsg,dto.IsSucceed));}接口说明:publicstaticListRunBP(IEnumerablebpList,ParallelOptionoption,paramsobject[]args)bpList:bp实例集合option:运行选项,1、为初始化BP上下文;2、为并发重试args:可变参数集合,目前只是传递小bp单据key属性。4.1.2.并行计算带来的复杂性项目串行程序并行程序程序行为特性可以预期的,相同运行环境下总可如果没有提供特定的同步手段,以得到相同的结果则程序执行的结果无法预期内存访问独占访问内存单元,数据可靠有可能因多线程同时存取同一内存单元而引发数据存取错误锁不需要必须为共享资源加锁死锁不可能出现可能出现,需要仔细考虑程序中可能出现的种种情况予以避免测试使用代码覆盖的测试方法可以检测出绝大多数BUG由于多个线程同时并行,仅使用代码覆盖的测试方法无法检测出程序中隐藏的BUG,并行程序的测试变得很复杂调试相对简单,可以随时停止程序运行,单步跟踪定位到每条语句和每个变量的值由于多个线程同时运行,当你暂停一个线程进行调试时,其他线程可能还在运行中,因此无法保证调试环境的一致性,并行程序的调试非常困难。4.1.2.1.内存公共资源初始化平台上下文时,系统会缓存当前企业数据,并行计算方式下,多线程导致方法InitialValueSetCache在向集合添加项时,需要加锁,防止集合报键值重复。4.1.2.2.死锁与并发(数据库公共资源)单据审核更新异动时,在手量表和最新结存成本表等公共资源,在并行计算方式下,会产生数据库死锁。死锁不能彻底解决,但可以降低发生概率,就异动这2个公共表,可以采取3种方式。1、顺序访问公共资源在更新异动时,不异动行按物料+存储地点排序。TransLine实现IComparable接口,且新增比较类TransLineComparer在调用更新异动逻辑前,先对TransLineList排序:transLineList.Sort(newTransLineComparer());2、晚加载公共资源异动中最新结存成本表跟在手量表一样,异动逻辑最后(session提交前)一次性处理。TransLineToLogFileDTOTransferupdateLogFile=newTransLineToLogFileDTOTransfer();updateLogFile.TransUpdateInvBalCost(TransLineList);3、捕获死锁和并发异常,重新处理死锁与并发是由并行计算导致,不论死锁还是并发,都有一个操作是成功的,所以把出错的再执行一遍,以提高批量操作的易用性。4、在手量子表增加索引CREATENONCLUSTEREDINDEXIX_WhQohON[dbo].[InvTrans_WhQohLine]([WhQoh])附件:列表批量操作(并行)涉及代码4.2.批量生单4.2.1.应用场景美心客开节点“排产工作台”以列表的方式显示需要释放为MO的销售计划行,用户批量选择需要释放的计划行,点击“释放”即可一对一的生成相应MO,同时回写销售计划行的已转出数量,每个计划行成功与否不影响其他行。4.2.2.并行方式1批量创建MO服务内部逻辑,不同于单据列表操作是循环调用更新实体状态BP,而是根据传入DTO,循环DTO调用内部方法,所以此处并行接口中的集合是List,执行方法是定义好的委托函数。如下:按此种方式每个DTO在不同线程中并行执行,创建MO和回写SO在同一个事务中,此种方式导致如下2个问题:4.2.2.1.问题1:回写SO系统版本并发异常因为一张SO会有多行SOShipLine,相同SO的不同SOShipLine在回写完已转出数量后,都会更新父实体的系统版本,在同一时刻不同线程都在执行回写,导致实体SO并发异常。4.2.2.2.问题2:取工序的作业代码并发冲突工序作业编码表是组织级表,类似序列号表,每道工序需要一个作业流水号,在同一时刻不同线程同时需要取作业编码,而取作业编码的代码段加了平台内存锁,所以同一时刻只有一个线程能加锁成功,其他线程加锁失败,代码抛出异常;另外一种情况,取作业编码的代码内部逻辑是先查询该组织和日期下有无此作业编码记录,没有则创建,线程T1加锁成功,并且成功创建作业编码记录,释放内存锁,但事务没有提交,这时线程T2加锁成功,因为事务是线程静态,所以T2查询不到T1创建的作业编码,进而又创建了一条相同维度作业编码,T1线程事务提交,T2线程事务提交时,作业编码表会报“业务主键冲突”。4.2.3.并行方式2为解决问题1和问题2,1、ISV服务参数DTO集合,按DTO中的SrcDoc_ID(SO的ID)分组,相同SO的SOShipLine为一个集合,修改委托方法的参数为集合,即按SO来启动线程;2、取作业编码的代码段单独开事务,在MO的Inserted方法中订阅事务的回滚事件,回滚前面提交的作业编码号。4.2.4.总结批量生单使用并行接口需满足:1、每单事务隔离2、如有回写逻辑,回写逻辑需通创建逻辑同在一个事务中3、为防止回写并发,需按来源单据头分组后再调用并行接口4、并行接口对应的委托方法体内部需要在循环体内开启事务5、生单过程中如果要操作全局表,则需要开启新事务,且订阅外围事务回滚事件,回退对全局表的操作。

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

用友U9知识-U9并行计算应用指南-new.docx

您可能关注的文档

确认删除?