并行程序设计模式--Master-Worker模式
- 简介
Master-Worker模式是常用的并行设计模式。它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程。Master进程负责接收和分配任务,Worker进程负责处理子任务。当各个Worker进程将子任务处理完后,将结果返回给Master进程,由Master进行归纳和汇总,从而得到系统结果。处理过程如下图:

Master-Worker模式的好处是,它能将大任务分解成若干个小任务,并发执行,从而提高系统性能。而对于系统请求者Client来说,任务一旦提交,Master进程就会立刻分配任务并立即返回,并不会等系统处理完全部任务再返回,其处理过程是异步的。
- Master-Worker模式结构
Master-Worker模式的主要结构如下图:

如上图所示,Master进程是主要进程,它维护着一个Worker进程队列、子任务队列和子结果集,Worker进程中的Worker进程不断的从任务队列中提取要处理的子任务,并将子任务的处理结果放入到子结果集中。
在上图中,Master:用于任务的分配和最终结果的合并;Worker:用于实际处理一个任务;客户端进程:用于启动系统,调度开启Master。
- Master-Worker模式代码实现
Master代码实现:
public class Master {
//任务队列
protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();
//worker进程队列
protected Map<String, Thread> threadMap = new HashMap<String, Thread>();
//结果集
protected Map<String, Object> resultMap = new HashMap<String,Object>();
//是否所有的子任务都结束
public boolean isComplete(){
for(Map.Entry<String, Thread> entry:threadMap.entrySet()){
if(entry.getValue().getState()!=Thread.State.TERMINATED){
return false;
}
}
return true;
}
public Master(Worker worker,int countWorker) {
worker.setResultMap(resultMap);
worker.setWorkQueue(workQueue);
for (int i = 0; i < countWorker; i++) {
threadMap.put(Integer.toString(i), new Thread(worker,Integer.toString(i)));
}
}
//提交任务
public void submit(Object obj){
workQueue.add(obj);
//System.out.println(obj.toString());
}
//返回子任务结果集
public Map<String, Object> getResultMap() {
return resultMap;
}
//开始运行所有worker进程,并进行处理
public void execute(){
for(Map.Entry<String, Thread> entry:threadMap.entrySet()){
entry.getValue().start();
}
}
}
Worker代码实现:
public class Worker implements Runnable {
//任务队列
protected Queue<Object> workQueue;
//子任务结果集
protected Map<String,Object> resultMap = new HashMap<String, Object>();
public void setWorkQueue(Queue<Object> workQueue) {
this.workQueue = workQueue;
}
public void setResultMap(Map<String, Object> resultMap) {
this.resultMap = resultMap;
}
public Object handle(Object input){
return input;
}
@Override
public void run() {
while(true){
Object input = workQueue.poll();
if(null==input) break;
//处理子任务
Object re = handle(input);
resultMap.put(Integer.toString(input.hashCode()),re);
//System.out.println(re.toString());
}
}
}
Master-Worker模式是一种串行任务并行化的方法,被分解的子任务在系统中可以并行处理。同时,如果有需要,Master进程不需要所有子任务都执行完成,就可以根据已有的部分结果集计算最终的结果。
现在以上面的Master-Worker实现为基础,来实现计算1-100的立方和。计算将被分解为100个子任务,每个子任务仅用于计算单独的立方和。Master产生固定数目Worker,来处理这些子任务。Worker不断的从任务集合中取出这些计算立方和的子任务,并将计算结果放入到Master的结果集中。Master负责将所有Worker的任务结果进行累加,从而产生最终的立方和。整个计算过程,Worker和Master的运算也是完全异步的,Master进程不必等所有的Worker进程都执行完成,就可以进行求和操作了。也就是所,Master在获取部分子任务的结果集时,就可以对最终结果进行计算了,从而提高了系统的并发性和吞吐量。
计算子任务的实现如下:
public class PlusWorker extends Worker {
@Override
public Object handle(Object input) {
Integer i = (Integer) input;
return i*i*i;
}
}
客户端代码如下:
public class Client {
public static void main(String[] args) {
Master m = new Master(new PlusWorker(), 5);//启动五个线程处理
for (int i = 0; i < 100; i++) {
m.submit(i);
}
m.execute();
int re = 0;
Map<String, Object> resultMap = m.getResultMap();
while(resultMap.size()>0||!m.isComplete()){
Set<String> keys = resultMap.keySet();
String key = null;
for(String k:keys){
key=k;
break;
}
Integer i = null;
if(key != null){
i = (Integer) resultMap.get(key);
}
if(i!=null){
re+=i;//并行计算结果集
}
if(key!=null){
resultMap.remove(key);//将计算完成的结果移除
}
}
System.out.println(re);
}
}
通过Master创建5个Worker工作线程和PlusWorker工作实例。提交完100个任务后,就开始计算子任务。这些子任务,由生成的5个Worker线程共同完成。Master并不等所有的子任务都计算完成,就开始访问子结果集进行最终结果的计算,直到子结果集中所有的数据都被处理,并且5个活跃的Worker线程全部终止,才能求出最终结果。
并行程序设计模式--Master-Worker模式的更多相关文章
- 【MPI学习2】MPI并行程序设计模式:对等模式 & 主从模式
这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分: ...
- Java进阶7 并发优化2 并行程序设计模式
Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...
- 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计
基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...
- 转 Master-Worker模式 并行程序设计模式--Master-Worker模式
简介 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负责处理子任务 ...
- 程序设计模式 —— State 状态模式
我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...
- 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计
学习了MPI四种通信模式 及其函数用法: (1)标准通信模式:MPI_SEND (2)缓存通信模式:MPI_BSEND (3)同步通信模式:MPI_SSEND (4)就绪通信模式:MPI_RSEND ...
- Java并行程序设计模式小结
这里总结几种常用的并行程序设计方法,其中部分文字源自<Java程序性能优化>一书中,还有部分文字属于个人总结,如有不对,请大家指出讨论. Future模式 一句话,将客户端请求的处理过程从 ...
- 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计
相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...
- 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计
这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...
随机推荐
- WinForm窗体间如何传值
窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...
- 浅谈export 以及环境变量
简要说一下env,set,export的区别:env命令显示环境变量,set和export显示环境变量和自定变量. export:可以讲自定变量转化为环境变量之前有一个疑惑,我们定义环境变量PATH时 ...
- 观nginx与lvs负载均衡的较量
在技术工作者中,常用到的就是lvs负载均衡和Nginx负载均衡了.这两者也是比较普及的.那么,根据不同的需求,两者存在着不同的优势.具体选择哪一个,还要看您的要求了.那么我们在此为大家分享一篇文章,对 ...
- 《MapReduce: Simplified Data Processing on Large Cluster 》翻译
Abstract MapReduce是一种编程模型和一种用来处理和产生大数据集的相关实现.用户定义map函数来处理key/value键值对来产生一系列的中间的key/value键值对.还要定义一个re ...
- HDU 5084 HeHe --找规律
题意: 给出矩阵M,求M*M矩阵的r行c列的数,每个查询跟前一个查询的结果有关. 解法: 观察该矩阵得知,令ans = M*M,则 ans[x][y] = (n-1-x行的每个值)*(n-1+y列的每 ...
- Jenkins遇到问题一:jenkins配置权限不对导致无法登陆或者空白页面解决办法
找到.jenkins/config.xml文件:替换为:1.<authorizationStrategy class="hudson.security.AuthorizationStr ...
- Android--使用VideoView播放视频
承香墨影 Android--使用VideoView播放视频 前言 之前有讲过如何使用SurfaceView配合MediaPlayer播放视频,其实Android还为开发人员提供了另外一种更简单 ...
- flex布局滑动页面
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 11Spring_AOP编程(AspectJ)_概述
AspectJ 是一个框架 (第三方AOP框架 ),提供切面编程 ,编写一个Aspect 支持多个Advice和多个PointCut .对比前一种提到的传统的Aop编程,AspctJ更加的常用.Asp ...
- 22Spring_JdbcTemplatem模板工具类的使用——使用外部属性文件来配置(properties)
前一篇文章写得是xml文件来配置数据库连接的.但是为了方便,我们实际中采用的是properties文件的方式来配置数据库的.修改properties 文件 会比 修改 xml文件 方便. 做法是: 将 ...