在Amino框架中为Master-Woker提供了较为完善的实现和便捷的操作接口。Amino实现了两套Master-Worker实现:一种是静态的Master-Worker实现,另外一种是动态的Master—Worker实现。
其中静态实现不允许在任务开始时添加新的子任务,而动态的Master-Worker允许在任务执行过程中,由Master或者Worker添加新的子任务。结构图如下所示:
其中:
Worker:用于实际处理一个任务;
Master:任务的分配和最终结果的合成;
Main:启动程序,调度开启Master。
下面看看静态的Master_Worker和动态的Master_Worker
静态:
import java.util.List; import java.util.Vector; import org.amino.pattern.internal.Doable; import org.amino.pattern.internal.MasterWorker; import org.amino.pattern.internal.MasterWorkerFactory; /** * * @author Administrator * 静态Master_Worker: * 需要实现Doable接口 */ public class Pow3 implements Doable<Integer, Integer>{ //计算立方和 public Integer run(Integer input) { // TODO Auto-generated method stub return input*input*input; } public static void main(String[] args) { MasterWorker<Integer, Integer> mw = MasterWorkerFactory.newStatic(new Pow3()); List<MasterWorker.ResultKey> keyList = new Vector<MasterWorker.ResultKey>(); for(int i=0;i<100;i++){ keyList.add(mw.submit(i)); // 提交任务 } mw.execute(); //执行任务 /** * 静态mw.execute()执行任务后不能继续添加,会报异常 */ for(int j=0;j<100;j++){ keyList.add(mw.submit(j)); } // int re=0; while(keyList.size()>0){ // Worker模式:不等待全部执行完毕,就开始求和, MasterWorker.ResultKey k = keyList.get(0); Integer i = mw.result(k); System.out.print("i="+i); if(i!=null){ re+=i; keyList.remove(0); //累加完成后,删除已处理的元素 System.out.println(",re="+re); } } System.out.println(re); } }
动态:
import java.util.List; import java.util.Vector; import org.amino.pattern.internal.DynamicWorker; import org.amino.pattern.internal.MasterWorker; import org.amino.pattern.internal.MasterWorkerFactory; import org.amino.pattern.internal.WorkQueue; import org.junit.Test; /** * * @author Administrator * 动态Master-Worker * 需要实现DynamicWorker接口 */ public class Pow3Dyn implements DynamicWorker<Integer, Integer>{ // 任务用于计算立方和 public Integer run(Integer w, WorkQueue<Integer> wq) { // TODO Auto-generated method stub return w*w*w; } @Test public void testPow3Dyn(){ MasterWorker<Integer, Integer> mw = MasterWorkerFactory.newDynamic(new Pow3Dyn()); List<MasterWorker.ResultKey> keyList = new Vector<MasterWorker.ResultKey>(); for(int i=0;i<50;i++){ keyList.add(mw.submit(i)); //提交任务 } mw.execute(); //计算任务 /** * 在已经开始执行任务的情况下,即执行完mw.execute()方法后,还可以继续添加,如果是静态模式,则不能继续添加 */ for(int i=50;i<100;i++){ keyList.add(mw.submit(i)); } int re=0; while(keyList.size()>0){ MasterWorker.ResultKey k = keyList.get(0); Integer i = mw.result(k); // key--value形式,通过k获取value i System.out.print("i="+i); if(i!=null){ re+=i; keyList.remove(0); System.out.println(",re="+re); } } System.out.println(re); } }
总结:
Master-Worker模式是一种将串行任务并行化的方案,被分解的子任务在系统中可以被并行处理,同时,Master进程不需要等待所有子任务都完成计算,就可以根据已有的部分结果集计算最终结果集。