使用目的: 任务异步,支持高并发量。各任务之间原子分离,提高可用性。
使用例子和场景:
一个请求任务中需要从多个服务器取回值,最终综合成一个结果给该请求任务答复,如果实行串行话模式,势必对系统资源造成了浪费影响了系统并发性,使用某队列任务模型,将解决这类问题。最典型实例 你去医院看病,分为诊断和交费部分,诊断时候 医生会让你先去做个检查,检查结果出来了,再去给你开药。交费的时候 医生会先让你交方,交方完了再给你发药。发完药才标志 整个看病时间的结束。
图示:
辅助队列:分为2个第一个是马上执行队列L,第二个是用于保存等待返回结果的任务队列M
细述:
1 程序接到看病任务后,new一个A(看病对象)后开始执行看病,开始看病伪代码类似
long CGohospital::Execute()
{
switch (m_State)
{
//诊断
case enum_dealdiagnos:
ApplyDiagnose();
break;
//取药
case enum_getmedical:
ApplyGetMedical();
break;
}
return m_emTaskState;
}
上部执行后,先进入的是诊断中,诊断执行后,会有两个子任务,检查和开药。执行检查和开药的时候也是先申请的,等到检查报告出来后,和药开出来后诊断这步骤才能算完毕。所以ApplyDiagnose也是分为2步骤1去申请 2等待回应结果。结果出来后才能考虑去取药
2 ApplyDiagnose诊断伪代码如下
ApplyDiagnose
{
//将CGohospital 压入队列M中备 诊断这个步骤完了用
M.pushback(this);
//关联任务表清0
this->m_corrList.Clear();//一会再讲
//添加检查根任务
pcheck =new CheckUnit()
L.push(pcheck);
//检查任务加入子队列
m_corrList.add(pcheck->GetTaskID())
//添加开药根任务
pPrescrib =new PrescribUnit();
L.push(pPrescrib);
//开药任务加入子队列
m_corrlist.add(pPrescrib->GetTaskID())
};
这里 检查和开药2个子任务分别都关联到了看病对像CGohospital上
检查任务包含
1先去做检查
2等待检查报告
直到检查报告拿到后,才能去找负责这块的医生根据你的检查报告给你开房子,这样就可以继续下一步“开方了”了
伪代码见下列
//执行任务
CheckUnit::Execute()
{
switch m_State;
{
case (伪代码)做体检并等待:
ApplyExaminination();
break;
case (伪代码)体检结果返回:
DealExaminReslt();
break;
}
return CTaskUnit::Execute();
}
注意, 这两个步骤,默认先进去的就是做体检并等待这步,逻辑很简单就是
1做体检
2等待体检结果回应(就是服务器响应的过程)
4最底层和基础的Examiniation类代码下
CheckUnit::ApplyExaminination()
{
//设置下次执行的将是处理执行结果的函数
m_State = enum_task_examin_rlt; //看病任务也入缓存,目的是等待化验结果出来后(从网络收到回复包)网络包可以再次激活该对象 //以便执行
M.pushback(this);
//做你自己的处理,比方说检查下,这步骤不用仔细扣,主要是便于理解可略过。
Doyourself(); //发送申请请求结果,之后this这个对象就处于等待状态,直到接收到服务器结果后才苏醒。
SendAskCheckDataToServer(Data);
}
注:结合第3步看该函数执行完毕后会接着第三步 return CTaskUnit::Execute()执行
CTaskUnit::Execute()的伪代码如下(未完待续)