• 简介

  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代码实现:

 1 public class Master {
2 //任务队列
3 protected Queue<Object> workQueue = new ConcurrentLinkedQueue<Object>();
4 //worker进程队列
5 protected Map<String, Thread> threadMap = new HashMap<String, Thread>();
6 //结果集
7 protected Map<String, Object> resultMap = new HashMap<String,Object>();
8
9 //是否所有的子任务都结束
10
11 public boolean isComplete(){
12 for(Map.Entry<String, Thread> entry:threadMap.entrySet()){
13 if(entry.getValue().getState()!=Thread.State.TERMINATED){
14 return false;
15 }
16 }
17 return true;
18 }
19
20 public Master(Worker worker,int countWorker) {
21 worker.setResultMap(resultMap);
22 worker.setWorkQueue(workQueue);
23 for (int i = 0; i < countWorker; i++) {
24 threadMap.put(Integer.toString(i), new Thread(worker,Integer.toString(i)));
25 }
26 }
27
28 //提交任务
29
30 public void submit(Object obj){
31 workQueue.add(obj);
32 //System.out.println(obj.toString());
33 }
34
35
36
37 //返回子任务结果集
38 public Map<String, Object> getResultMap() {
39 return resultMap;
40 }
41
42 //开始运行所有worker进程,并进行处理
43
44 public void execute(){
45 for(Map.Entry<String, Thread> entry:threadMap.entrySet()){
46 entry.getValue().start();
47 }
48 }
49
50 }

  Worker代码实现:

 1 public class Worker implements Runnable {
2 //任务队列
3 protected Queue<Object> workQueue;
4 //子任务结果集
5 protected Map<String,Object> resultMap = new HashMap<String, Object>();
6
7
8 public void setWorkQueue(Queue<Object> workQueue) {
9 this.workQueue = workQueue;
10 }
11 public void setResultMap(Map<String, Object> resultMap) {
12 this.resultMap = resultMap;
13 }
14
15 public Object handle(Object input){
16 return input;
17 }
18 @Override
19 public void run() {
20 while(true){
21 Object input = workQueue.poll();
22
23 if(null==input) break;
24 //处理子任务
25 Object re = handle(input);
26 resultMap.put(Integer.toString(input.hashCode()),re);
27 //System.out.println(re.toString());
28 }
29 }
30
31 }

  Master-Worker模式是一种串行任务并行化的方法,被分解的子任务在系统中可以并行处理。同时,如果有需要,Master进程不需要所有子任务都执行完成,就可以根据已有的部分结果集计算最终的结果。

  现在以上面的Master-Worker实现为基础,来实现计算1-100的立方和。计算将被分解为100个子任务,每个子任务仅用于计算单独的立方和。Master产生固定数目Worker,来处理这些子任务。Worker不断的从任务集合中取出这些计算立方和的子任务,并将计算结果放入到Master的结果集中。Master负责将所有Worker的任务结果进行累加,从而产生最终的立方和。整个计算过程,Worker和Master的运算也是完全异步的,Master进程不必等所有的Worker进程都执行完成,就可以进行求和操作了。也就是所,Master在获取部分子任务的结果集时,就可以对最终结果进行计算了,从而提高了系统的并发性和吞吐量。

  计算子任务的实现如下:

1 public class PlusWorker extends Worker {
2
3 @Override
4 public Object handle(Object input) {
5 Integer i = (Integer) input;
6 return i*i*i;
7 }
8
9 }

  客户端代码如下:

 1 public class Client {
2 public static void main(String[] args) {
3 Master m = new Master(new PlusWorker(), 5);//启动五个线程处理
4 for (int i = 0; i < 100; i++) {
5 m.submit(i);
6 }
7 m.execute();
8 int re = 0;
9 Map<String, Object> resultMap = m.getResultMap();
10 while(resultMap.size()>0||!m.isComplete()){
11 Set<String> keys = resultMap.keySet();
12 String key = null;
13 for(String k:keys){
14 key=k;
15 break;
16 }
17 Integer i = null;
18 if(key != null){
19 i = (Integer) resultMap.get(key);
20 }
21 if(i!=null){
22 re+=i;//并行计算结果集
23 }
24
25 if(key!=null){
26 resultMap.remove(key);//将计算完成的结果移除
27 }
28 }
29
30 System.out.println(re);
31 }
32 }

  通过Master创建5个Worker工作线程和PlusWorker工作实例。提交完100个任务后,就开始计算子任务。这些子任务,由生成的5个Worker线程共同完成。Master并不等所有的子任务都计算完成,就开始访问子结果集进行最终结果的计算,直到子结果集中所有的数据都被处理,并且5个活跃的Worker线程全部终止,才能求出最终结果。

转 Master-Worker模式 并行程序设计模式--Master-Worker模式的更多相关文章

  1. 【MPI学习2】MPI并行程序设计模式:对等模式 & 主从模式

    这里的内容主要是都志辉老师<高性能计算之并行编程技术——MPI并行程序设计> 书上有一些代码是FORTAN的,我在学习的过程中,将其都转换成C的代码,便于统一记录. 这章内容分为两个部分: ...

  2. Java进阶7 并发优化2 并行程序设计模式

    Java进阶7 并发优化2 并行程序设计模式20131114 1.Master-worker模式 前面讲解了Future模式,并且使用了简单的FutureTask来实现并发中的Future模式.下面介 ...

  3. 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计

    基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...

  4. 并行程序设计模式--Master-Worker模式

    简介 Master-Worker模式是常用的并行设计模式.它的核心思想是,系统有两个进程协议工作:Master进程和Worker进程.Master进程负责接收和分配任务,Worker进程负责处理子任务 ...

  5. 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计

    学习了MPI四种通信模式 及其函数用法: (1)标准通信模式:MPI_SEND (2)缓存通信模式:MPI_BSEND (3)同步通信模式:MPI_SSEND (4)就绪通信模式:MPI_RSEND ...

  6. 程序设计模式 —— State 状态模式

    我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一 ...

  7. Java并行程序设计模式小结

    这里总结几种常用的并行程序设计方法,其中部分文字源自<Java程序性能优化>一书中,还有部分文字属于个人总结,如有不对,请大家指出讨论. Future模式 一句话,将客户端请求的处理过程从 ...

  8. 【MPI学习5】MPI并行程序设计模式:组通信MPI程序设计

    相关章节:第13章组通信MPI程序设计. MPI组通信与点到点通信的一个重要区别就是:组通信需要特定组内所有成员参与,而点对点通信只涉及到发送方和接收方. 由于需要组内所有成员参与,因此也是一种比较复 ...

  9. 【MPI学习4】MPI并行程序设计模式:非阻塞通信MPI程序设计

    这一章讲了MPI非阻塞通信的原理和一些函数接口,最后再用非阻塞通信方式实现Jacobi迭代,记录学习中的一些知识. (1)阻塞通信与非阻塞通信 阻塞通信调用时,整个程序只能执行通信相关的内容,而无法执 ...

随机推荐

  1. python程序正式开始

    第几个hello world 程序了,为曾经没有毅力的自己默哀下.今天的课程语言的分类,三大类:机器语言,汇编语言,高级语言. 其中最让我痛恨的就是汇编语言,我们大学没事开什么这课程,大学混日子的喔不 ...

  2. win7 英文版 中文乱码

    win7 为了使用英文的 pcb 软件,把语言包改为英文版后,碰到一部分中文会变成乱码.通过下面方法可以识别: control panel --> region and language --& ...

  3. linux redis 启动 overcommit_memory

    Redis在启动时不成功, 查看日志发现如下警告: WARNING overcommit_memory is set to 0! Background save may fail under low ...

  4. awk选取制定行数,条件判断等

    awk '{if(NR%5==0){print}}' your_file 取出可以被5整除的数awk '{if(NR<=300){print}}' your_file 取出行数小于300的数据a ...

  5. mobilenet之Depthwise +Pointwise

    我们知道,mobilenet是适用于移动端的深度学习网络,主要优点是参数少.模型小.准确率相比一些传统卷积损失少等特点. mobileNet之所以这么ok,是因为引入了Depthwise +Point ...

  6. MFC笔记10

    1. CDC MemDC1; MemDC1.SetBkMode(OPAQUE); 背景模式,VC6下面有三种:/* Background Modes */#define TRANSPARENT 1// ...

  7. 从零开始搭建自己的VueJS2.0+ElementUI单页面网站(一、环境搭建)

    原网址:https://blog.csdn.net/u012907049/article/details/72764151 前言 VueJS可以说是近些年来最火的前端框架之一,越来越多的网站开始使用v ...

  8. Windows 10同步时间的方法

    今天在安装了Windows 10 1809(October 2018 update)之后发现时间不能同步,以前并没有出现这种情况. 1) 打开控制面板,找到时钟域地区 2) 选择日期和时间 3) 选择 ...

  9. 解决Windows 10 1803 April 2018 Updatete不能网络共享的问题

    Windows 10升级到1803后便不能网络共享了,现在我用的是Widnows 10 1809 Oct 2018 Update依然存在这个问题. 为了能够共享文件和文件夹需要去windows ser ...

  10. Linux的top命令

    文章来自于长风破浪博主的内容,下面是该博客网址. https://www.cnblogs.com/dragonsuc/p/5512797.html 为了自己能多学习,多记忆,所以直接搬到了这里,希望小 ...