Master-Worker模式

dzzgml發表於2018-04-09

模式介紹

Master-Worker模式是常用的並行設計模式。核心思想是,系統由兩個角色組成,Master和Worker,Master負責接收和分配任務,Worker負責處理子任務。任務處理過程中,Master還負責監督任務進展和Worker的健康狀態;Master將接收Client提交的任務,並將任務的進展彙總反饋給Client
如下圖所示:

Master-Worker模式

Master-Worker模式Master-Worker模式

Master-Worker模式

Master-Worker模式

Worker:用於實際處理一個任務;

Task:具體任務實體

Master:任務的分配和最終結果的合成;
Main:啟動程式,排程開啟Master

程式碼實現

/**
 * @author mouliu
 * @create 2018-04-07-下午10:03
 */
public class Task {

    private int id;
    private int price ;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        this.price = price;
    }
}
複製程式碼
/**
 * @author mouliu
 * @create 2018-04-09-上午9:22
 */
public class Main {
    public static void main(String[] args){
        Master master = new Master(new Worker(),20);

        Random r = new Random();
        for (int i=1;i<=100;i++){
            Task t = new Task();
            t.setId(i);
            t.setPrice(r.nextInt(1000));
            master.submit(t);
        }
        master.execute();
        long start = System.currentTimeMillis();
        while (true){
            if (master.isComplete()){
                long end = System.currentTimeMillis()-start;
                int priceResult = master.getResult();
                System.out.println("最終結果:" + priceResult + ", 執行時間:" + end);
                break;
            }
        }
    }
}
複製程式碼
/**
 * @author mouliu
 * @create 2018-04-07-下午10:07
 */
public class Worker implements Runnable{
    private ConcurrentLinkedQueue<Task>workQueue;
    private ConcurrentHashMap<String,Object>resultMap;

    public void setWorkQueue(ConcurrentLinkedQueue<Task>workQueue){
        this.workQueue = workQueue;
    }

    public void setResultMap(ConcurrentHashMap<String,Object> resultMap){
        this.resultMap = resultMap;
    }

    @Override
    public void run() {
        while (true){
            Task input = this.workQueue.poll();
            if (input==null){
                break;
            }
            Object output = handle(input);
            this.resultMap.put(Integer.toString(input.getId()),output);
        }
    }

    private Object handle(Task input){
        Object output = null;
        try {
            Thread.sleep(500);
            output = input.getPrice();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return output;
    }
}
複製程式碼
/**
 * @author mouliu
 * @create 2018-04-07-下午10:02
 */
public class Master {
    //1、有一個盛放任務的容器
    private ConcurrentLinkedQueue<Task>workQueue =
            new ConcurrentLinkedQueue<>();
    //2、需要有一個盛放worker的集合
    private HashMap<String,Thread> workers = new HashMap<>();

    //3、需要有一個盛放每一個worker執行任務的結果集合
    private ConcurrentHashMap<String,Object> resultMap=
            new ConcurrentHashMap<>();

    //4、構造方法(建立給定數量的執行緒)
    Master(Worker worker,int workerCount){
        worker.setWorkQueue(this.workQueue);
        worker.setResultMap(this.resultMap);

        for (int i=0;i<workerCount;i++){
            this.workers.put(Integer.toString(i),new Thread(worker));
        }
    }
    //5、需要一個提交任務的方法
    public void submit(Task task){
        this.workQueue.add(task);
    }
    //6、需要有一個執行的方法,啟動所有的worker方法去執行任務
    public void execute(){
        for (Map.Entry<String,Thread>me:workers.entrySet()){
            me.getValue().start();
        }
    }
    //7、判斷是否執行結束的方法
    public boolean isComplete(){
        for (Map.Entry<String,Thread>me:workers.entrySet()){
            if (me.getValue().getState()!=Thread.State.TERMINATED){
                return  false;
            }
        }
        return true;
    }
    //8、計算結果方法
    public int getResult(){
        int priceResult = 0;
        for (Map.Entry<String,Object>me:resultMap.entrySet()){
            priceResult+=(Integer) me.getValue();
        }
        return priceResult;
    }
}複製程式碼

總結:

Master-Worker模式可以將大任務劃分為小任務的場景,是一種分流處理的設計理念。通過多執行緒或者多程式多機器的模式,可以將小任務處理分發給更多的CPU處理可以提高任務的完成速度,提高系統的效能。



相關文章