介绍编程
编写一个应用程序并行运行很困难,对吧?个人意思是,它必定很难,不然咱们会看到各处的并行程序。咱们所看到的都是平滑的并行应用程序,能够绝不费力地使用每一个可用的核心。相反,多线程应用程序是例外而不是规则。安全
编写并行程序彷佛有两个主要障碍:多线程
学习您选择的语言提供的并行编程结构和/或约定并发
可视化您的并行程序的功能框架
第一项彷佛很明显:休息一下,学习所选编程语言的并行功能,而后离开你 - 并行程序将从你的编译器中跳出。除非那天下午一般会变成几天,这一般会变成一段更长的时间,而你选择的语言的平行特征的含义,并发症和后果则会被驯服。异步
第二项彷佛应该提到几乎是微不足道的。毕竟,开发一个新计划的第一步是想象它的主要组成部分以及它们将如何运做。除了咱们一般将咱们的新程序可视化为顺序代码组件,以便咱们稍后(若是必须的话)将某些并行的东西“栓上”。正是这种思惟框架使咱们从一开始就走上了错误的道路。编程语言
相反,咱们须要考虑像鸟这样的程序。或者说,成群的鸟儿。分布式
背景微服务
Avian计算项目是经过改进咱们对并行编程的思考来改善并行编程的一种方式。Avian Computing鼓励咱们将并行程序可视化为一群鸟,每一个鸟(线程)独立并异步地执行操做,但它们同时做为一群来完成程序的目标。源码分析
咱们都熟悉鸟类:它们被孵化出来,四处飞翔寻找食物,产卵并孵化本身的鸟类,而后死亡。Avian Computing将这些基本的鸟类行为转化为开发人员能够利用的编码框架来快速开发工做并行程序的原型。从构建这个工做原型得到的知识深度和看法能够简化最终软件产品的开发。
Avian计算的实现
并发资源管理器(ConcX)是用Java编写的Avian Computing的概念的免费开源实现。ConcX为用户提供了一个能够建立和配置新鸟的GUI屏幕。配置完成后,能够启动小鸟并在进度条上监控其活动。配置好的鸟群能够保存为一个“群”,能够根据须要从新加载和运行。
一旦孵化(开始),每只鸟(线)遵循标准生命周期; 它寻找食物,消化找到的任何匹配的食物,储存任何产生的食物,而后小睡一下子。在配置的耐力时限内找不到食物的鸟类将因饥饿而死亡。活得过久的鸟会死于老年。成功吃足以知足可配置设置的鸟类将复制(重复本身)。这个标准生命周期容许使用简单天然的词汇来处理线程管理的复杂性,这些词汇几乎能够直观地理解。
ConcX依赖于Linda协调语言来从共享虚拟关联存储器(称为元组空间)中放置和检索对象。Linda起源于1986年,由Sudhir Ahuja,David Gelernter和Nicholas Carriero创做。Linda是几个主要产品的基础,包括Sun的JavaSpaces,IBM的TSpaces等等。
ConcX使用称为TupleTree的Linda元组空间的简化版本。鸟类一般配置为在TupleTree中食用和储存食物豆荚。例如,RedPod能够被配置为吃RedPods的任何鸟食用,而且将被全部其余鸟类忽略。在消化它的食物荚后,一只鸟会将加工后的物体存放回TupleTree,一般做为不一样种类的食物荚(例如BluePod),以供不一样的鸟类食用。
Linda(及其派生,TupleTree)提供了一个安全,简单和强大的消息传递机制。在ConcX中,TupleTree容许在用户编写的代码中没有任何特殊的代码或注意事项的状况下共享对象,由于TupleTree同步(锁定或以其余方式提供独占访问)全部与其底层数据存储交互的方法。
使TupleTree对全部锁定负责,确保鸟儿接收的任何食物吊舱(物体)彻底由该鸟类拥有,而不会使用锁定和互斥等使用户代码混乱。这意味着任何接收到食物吊舱的鸟都是免费的在没有来自任何其余鸟类的争用或干扰的状况下对该食品盒进行任何改变。在作出任何须要的改变以后,该鸟能够将其食物吊舱放回TupleTree,在那里不一样种类的鸟会吃它并进行改变。
平行思惟的简单范例
ConcX提供的Addx场景是Avian计算概念如何生成更简单的并行代码的直接示例。Addx场景的目标是经过对每一个值执行一系列数学运算来处理一系列值,直到计算出最终值并保存为止。数学运算必须始终以相同的顺序执行。
在标准的顺序编码中,咱们将经过获取下一个值,执行第一个数学运算,而后第二个数学运算,而后第三个数学运算等开始可视化一个循环,直到计算出最终值为止,该值为保存,而后循环重复。看起来相对简单,而且运行速度尽量快。其最大吞吐量取决于执行单线程的一个处理器的速度。
为了更快速地处理更多的值,须要使用多个处理器,这就是棘手的问题。正常的解决方案是建立一个线程池,每一个线程执行上述的顺序代码。可是这会使处理复杂化,由于并行代码必须 确保输入值仅由一个线程处理,而且不会跳过输入值,同时确保不会发生死锁和活锁。很难想象线程可能会互相干扰的全部可能的方式 - 在客户的站点上展现了屡次新的使人惊讶的失败模式。更不用说必须为每一个运行时环境(笔记本电脑vs大型机等)预先配置和编译多个版本的应用程序。
Addx(Avian)解决方案配置了一个任意数量的鸟群,每只鸟只吃一种食物,而且在将其做为不一样类型的食物放回以前,只对该食物执行一次数学运算。经过适当配置食物和储存的食物,保证数学操做的正确顺序。例如,Bird1吃Food1,对其执行数学运算,并将其存储为Food2。Bird2吃Food2,对它进行数学运算,并将其做为Food3存储。Bird3吃Food3,等等。这也能够更简洁地表达为:
食物1 - > Bird1 - > FOOD2 - > BIRD2 - > Food3 - > Bird3。。。.Foodn - > Birdn。
如下简化图说明了Avian并行性。
在下面的生命周期1中,全部五只鸟在大约同一时间开始飞行,但只有Add1Bird找到任何食物。它对该值执行操做,而后将其做为只有Add2Bird吃的食物放回到TupleTree中。
在生命周期2中,Add1Bird和Add2Bird均可以找到食物,以便他们都执行各自的操做,而后将其食物存储回TupleTree。
在生命周期3中,Add1Bird,Add2Bird和Add3Bird均可以找到它们的食物种类,处理它们并将它们放回到TupleTree中。
大约第五个循环经过它们的生命周期(找到食物,消化它,储存它和午睡),全部五只鸟同时从TupleTree进食,处理它们的荚,并将它们更新的荚储存在树中。上面只画了5只鸟,但很容易想象将这个图放大到包括20只或50只或100只鸟,它们都将同时运行(飞行),全部这些都遵循相同的简单和天然的模式。就像真正的鸟类同样,若是任何鸟类寻找食物而且没有找到它,它就会等待一下子,而后再次尝试。
重要提示:如图所示这鸟不步调一致操做的简化图。每只小鸟以其本身的个体速率生活,由于每次小睡时,它会随机选择一段时间(在可配置的范围内)。这意味着随机短期小睡的小鸟会比随机长时间小睡的小鸟更快地完成其生命周期。随着时间的推移,午睡的时间长短会趋于平缓,因此一段时间之后会很慢。在现实生活中,Add5Bird(或任何其余鸟)开始吃以前可能须要3或10或15个周期。
配置鸟类
ConcX提供GUI屏幕来添加,配置和启动鸟类。GUI屏幕还能够在鸟儿飞行时提供动态的实时状态更新。如下屏幕截图显示了运行Addx场景的五只小鸟。屏幕右侧的进度条实时显示每只鸟的成功。每只鸟的进度条越长,鸟成功吃的次数就越多。
因为每只鸟都有用户可选择的食物类型,所以从新排列数学运算的顺序很简单。只需更改选定的食物并从新运行便可。若是任何鸟的配置不合适,它将没法找到食物,其进度条也不会增加。
“食物供应”选项卡包含食物容器进度条,能够实时动态显示可用食物容器的数量。当运行结束时,TupleTree选项卡显示其包含的食物荚的时间戳列表以及每一个食物荚内容的简要摘要以及每一个食物荚和哪些鸟执行的交易。
上述功能都集成到并发资源管理器中,容许您交互式地探索和开发并行程序。一旦你了解了如何将程序分解为能够并行运行的子步骤,则可使用所选择的编程语言对应用程序进行编码。
使用代码
下面显示了Add3Bird的完整Java代码。它只有43行,几乎一半(19)的行能够是注释或空白(用于视觉分离的空白或单个花括号)。Add3Bird所需的惟一代码是afterDigestion方法的重写,它所作的只是将3添加到它找到的任何非空食品盒中。查找窗体并将其存储回树中都由BasicBird框架处理,使开发人员的工做变得更轻松。
对于上面的代码最重要的是,在这段代码中没有锁定或同步或互斥,由于它所有由TupleTree和ConcX框架处理。全部的多线程并行代码都在后台进行管理,所以用户能够专一于如何将主要任务划分为鸟类能够并行处理原子的小尺寸碎片。
虽然上述任务可能看起来过于简单,但它实际上只是更复杂场景的模板。例如,若是Add1Bird被一只抓住10毫秒声音的鸟取代而且Add2Bird被替换为对其执行快速傅里叶变换的鸟而且Add3Bird被替换为试图将所得输出与其余先前处理的结果等。若是第二只鸟跟不上第一只鸟,而不是试图修改它以加快运行速度(而且可能引入错误),那么首选的Avian解决方案就是添加另外一个实例(或另外10个实例)第二只鸟。
兴趣点
Avian Computing的开发旨在鼓励用户基于天平生行的模型(例如鸟群)来形象化他们的并行程序。蜜蜂蜂群,鱼群或马群也能够做为模型,由于它们都包含多个独立运行而且异步运行的角色,同时也能够一块儿工做。
ConcX是由开发人员/实验者共同建立的。这是一个交互式环境,容许用户启动和中止鸟类的各类组合和配置。虽然每只鸟的飞行都有一个不断更新的进度条,以显示它的成功程度和可用的食物供应量。飞行结束后,能够检查鸡群的结果以及每只鸡的事件历史记录。
Avian Computing和ConcX实现的概念旨在成为培训轮子,帮助咱们的单线程思惟思考并讨论并行程序。
要详细了解Avian Computing的基本概念以及为何咱们须要帮助来思考并行程序,请访问Avian Computing网站。若是您准备尝试一下,能够从Avian网站或SourceForge下载ConcX-2.x.zip(jar文件,lib文件和flock文件)。请务必同时下载“Avian Computing入门指南”用户指南,由于它包含安装信息以及大约十几种并行方案,例如并行计算Pi,用餐哲学家Probelm,BarberShop场景等。
针对上面的技术我特地整理了一下,有不少技术不是靠几句话能讲清楚,因此干脆找朋友录制了一些视 频,不少问题其实答案很简单,可是背后的思考和逻辑不简单,要作到知其然还要知其因此然。若是想 学习Java工程化、高性能及分布式、深刻浅出。微服务、Spring,MyBatis,Netty源码分析的朋友能够 加个人Java进阶群:744642380,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分 享给你们