`

Amino简单调度模式之 Master-Worker模式

 
阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics