在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进程不需要等待所有子任务都完成计算,就可以根据已有的部分结果集计算最终结果集。