Master-Worker模式简介

Master-Worker模式是非常经典的常用的一个并行计算模式,它的核心思想是2类进程协作工作:Master进程和Worker进程。Master负责接收客户端请求,分配任务;Worker负责具体处理任务。当各个Worker处理完任务后,统一将结果返回给Master,由Master进行整理和总结。其好处是能够将一个大JOB分解成若干小JOB,并行执行,从而提高系统的吞吐量。比如流行的Web Server,如Nginx,Apache HTTP都存在这种Master-Worker工作模式;离线分布式计算框架Hadoop的JobTracker和TaskTracker,实时流计算框架Strom的Nimbus和Supervisor都涉及到这种思想。那么下面我们来具体分析下Java Master-Worker模式的实现。

Master-Worker模式分析

我们重点分析下Master,Worker这2个角色。

Master

Master需要接受Client端提交过来的任务Task,而且还得将Task分配给Worker进行处理,因此Master需要一个存储来存放Task。那么采用哪种存储集合呢?首先来说,需要支持并发的集合类,因为多个Worker间可能存在任务竞争,因此我们需要考虑java.util.concurrent包下的集合。这里可以考虑采用非阻塞的ConcurrentLinkedQueue。

Master需要清楚的知道各个Woker的基本信息,如是否各个Worker都运行完毕,因此Master端需要保存Worker的信息,可以采用Map存储。

由于最后各个Worker都会上报运行结果,Master端需要有一个存储结果的Map,可以采用支持并发的ConcurrentHashMap。

Worker

Worker需要持有Master端的任务Task集合的引用,因为Worker需要从里面拿取Task。

同上,Worker需要持有Master端的存储结果的引用。

综上,我们可以得到如下:

我们可以进一步细化,Master/Worker应该提供什么操作?

Master:

  1. 通过构造方法以初始化workers

  2. 应该提供submit(Task)方法接受Client端提交过来的任务

  3. start()让workers开始处理任务

  4. 提供isComplete()判断各个worker的状态,是否都处理完毕

  5. 提供getResult()给客户端返回结果

Worker:

  1. Worker本质上就是Runnable,提供run()

  2. 负责处理业务逻辑的handle()

Java Master-Worker代码实现

Task

public class Task {private long id;private String name;public Task(long id, String name) {this.id = id;this.name = name;}public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Worker

public class Worker implements Runnable {private long id;private String name;private ConcurrentLinkedQueue<Task> workQueue;private ConcurrentHashMap<Long,Object> results;public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {this.workQueue = workQueue;}public void setResults(ConcurrentHashMap<Long, Object> results) {this.results = results;}public Worker(long id, String name) {this.id = id;this.name = name;}@Overridepublic void run() {while(true){Task task = workQueue.poll();if(task == null){break;}long start = System.currentTimeMillis();long result = handle(task);this.results.put(task.getId(),result);System.out.println(this.name + " handle " + task.getName() + " success . result is " + result + " cost time : " + (System.currentTimeMillis() - start));}}/*** 负责处理具体业务逻辑* @param task* @return*/private long handle(Task task) {//这里只是模拟下,在真实环境也许是查询数据库,也许是查缓存等try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}return new Random().nextLong();}
}

Master

public class Master {private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<Task>();private Map<Long,Thread> workers = new HashMap<Long, Thread>();private ConcurrentHashMap<Long,Object> results = new ConcurrentHashMap<Long, Object>();public Master(int num){for(int i = 0 ; i < num ; i++){Worker worker = new Worker(i,"worker-" + i);worker.setResults(results);worker.setWorkQueue(workQueue);workers.put(Long.valueOf(i),new Thread(worker));}}public void submit(Task task){workQueue.add(task);}public void start(){for (Map.Entry<Long,Thread> entry : workers.entrySet()){entry.getValue().start();}}public boolean isComlepte(){for(Map.Entry<Long,Thread> entry : workers.entrySet()){if(entry.getValue().getState() != Thread.State.TERMINATED){return false;}}return true;}public long getSumResult(){long value = 0;for(Map.Entry<Long,Object> entry : results.entrySet()){value = value + (Long)entry.getValue();}return value;}
}

Main

public class Main {public static void main(String[] args) {Master master = new Master(10);for(int i = 0 ; i < 10 ; i++){Task task = new Task(i,"task-" + i);master.submit(task);}long start = System.currentTimeMillis();master.start();while(true){if(master.isComlepte()){System.out.println("sum result is " + master.getSumResult() + " . cost time : " + (System.currentTimeMillis() - start));break;}}}}

运行结果

总结

在单线程的时候,处理一个Task需要500ms,那么处理10个Task需要5S,如果采用Master-Worker这种并行模型,可以大大缩短计算处理时间。

转载于:https://blog.51cto.com/zhangfengzhe/1879323

Java Master-Worker模式实现相关推荐

  1. linux 并行 模式,并行设计模式-Master/Worker

    Master-Worker设计模式核心思想是将原来串行的逻辑并行化,并将逻辑拆分成很多独立模块并行执行,其中主要包含两个主要组件Master和Worker,Master主要讲逻辑进行查分,拆分为互相独 ...

  2. java master work_并发编程之Master-Worker模式

    我们知道,单个线程计算是串行的,只有等上一个任务结束之后,才能执行下一个任务,所以执行效率是比较低的. 那么,如果用多线程执行任务,就可以在单位时间内执行更多的任务,而Master-Worker就是多 ...

  3. Nginx源码分析:master/worker工作流程概述

    nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的master与worker工作模式 在生成环境中的Nginx启动模式基本都是以m ...

  4. Apache的prefork模式和worker模式

    prefork模式 这个多路处理模块(MPM)实现了一个非线程型的.预派生的web服务器,它的工作方式类似于Apache 1.3.它适合于没有线程安全库,需要避免线程兼容性问题的系统.它是要求将每个请 ...

  5. 切换apache的prefork和worker模式

    Apache HTTP服务器被设计为一个强大的.灵活的能够在多种平台以及不同环境下工作的服务器. 不同的平台和不同的环境经常产生不同的需求,或是为了达到同样的最佳效果而采用不同的方法. Apache凭 ...

  6. 彻底理解Java的feature模式

    先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材.网上购买厨具比较方便,食材去超市买更放心. 实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材.所以,在主线程里面另起一个子线 ...

  7. Java实现SSH模式加密

    版权声明:欢迎转载,请注明沉默王二原创. https://blog.csdn.net/qing_gee/article/details/44409735 Java实现SSH模式加密 一.SSH加密原理 ...

  8. java简单工厂模式_Java 简单工厂模式

    Java 简单工厂模式 2014-05-28·WeaponX 3717 次浏览 ## 介绍 简单工厂模式又称静态工厂模式. 简单工厂模式由工厂类角色.抽象产品角色和具体产品角色组成. 工厂类角色是本模 ...

  9. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  10. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

最新文章

  1. android运动轨迹rungps_android运动轨迹rungps_Android使用百度地图API实现GPS步行轨迹...
  2. SAP事务码MM17物料主数据批量维护
  3. 什么是负边沿触发_晶闸管的导通条件是什么 晶闸管(可控硅)检测方法
  4. 028_自己实现一个LinkedList
  5. [翻译] Visual Studio 2019 RC版发布
  6. 【SpringCloud】Spring cloud Alibaba Nacos 集群和持久化配置
  7. jsonobject修改key的值_JSONObject(org.json)的一点修改
  8. GIt帮助文档之创建新的Git仓库——现有目录下,通过导入所有文件来创建
  9. 面试—每日一题(2)
  10. 初用python爬取麦x学院python教学视频
  11. BSM的两个基本问题与python实现(欧式期权定价公式)
  12. CSS基础教程 -- 媒体查询屏幕适配
  13. android.os.FileUriExposedException: file:///storage/emulated/0/1566547538954.jpg exposed beyond app
  14. python实现QQ邮件的自动收发
  15. linux中i的英文单词,Linux下gcc/g++中-I(i的大写)、-L和-l
  16. C++常见问题总结_构造函数与析构函数
  17. 哔哩大学计算机学院:初识常量变量学习笔记
  18. 适配器模式(对象适配器)
  19. 人民币数字转人民币大写的函数
  20. 供应思科无线AP 华为无线AP 华三无线AP aruba无线AP ruckus无线AP

热门文章

  1. 30个数据可视化超级工具_Python5个数据可视化工具
  2. 基金评审人总结的15条写作技巧
  3. 下列那些是oracle的伪列,oracle伪列
  4. autocomplete触发事件_输入内容的自动匹配(AutoCompleteTextView)的点击事件遇到的问题...
  5. 小程序云服务器选什么系统好,小程序云服务器操作系统选择
  6. PyTorch随笔-2
  7. 【机器学习】机器学习实践中的 7 种常见错误
  8. 【数据竞赛】这篇文章送给想要学习特征交叉的朋友。
  9. 【供参考】2021 中国一流大学名单(30 所)和中国大学综合实力 700 强出炉!
  10. 【机器学习】基于LightGBM算法实现数据挖掘!