一种无阻塞高并发任务模型(从你去医院看病的模式描述)

本文介绍了一种通过任务异步和队列管理来支持高并发量的系统设计方法。利用这种模型,可以在多个服务器间高效地分配任务,确保系统的稳定性和响应速度。文章通过一个医院就诊流程的例子详细解释了其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 使用目的:

            任务异步,支持高并发量。各任务之间原子分离,提高可用性。

  使用例子和场景:

           一个请求任务中需要从多个服务器取回值,最终综合成一个结果给该请求任务答复,如果实行串行话模式,势必对系统资源造成了浪费影响了系统并发性,使用某队列任务模型,将解决这类问题。最典型实例 你去医院看病,分为诊断和交费部分,诊断时候 医生会让你先去做个检查,检查结果出来了,再去给你开药。交费的时候 医生会先让你交方,交方完了再给你发药。发完药才标志 整个看病时间的结束。

            图示:

  辅助队列:分为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()的伪代码如下(未完待续)





           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值