异步执行同步等待结果

需求:

我们的Server服务接收Http请求,经过一系列的异步请求其它Server(对,我们的Server是一个FrontServer)后,生成最终的结果,返回给请求者。

在这个过程中,需要我们的Server等待一定时间,如果结果无法得出,也需要给前端返回错误码。

这是一个非常常见的需求,我们的方案很朴素,直接用POSIX的pthread_xx 函数调用,具体如下

struct SessionTask {
   pthread_mutex_t result_lock;
   pthread_cond_t result_cond;
};

int SessionTask::lock_and_wait(int time_inms)
{
    pthread_mutex_lock(&result_lock); // 异步改同步的锁
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);
    long nanosec = time_inms*1000000L;
    nanosec += ts.tv_nsec;
    static const int kNanoInSec = 1000000000L;
    ts.tv_nsec = nanosec % kNanoInSec;
    if (nanosec >= kNanoInSec)
    {
        ts.tv_sec += nanosec/kNanoInSec;
    }
    int ret = 0;
    if(ETIMEDOUT == pthread_cond_timedwait(&result_cond, &result_lock, &ts))
    {
        ret = -1;
    }
    pthread_mutex_unlock(&result_lock);
    return ret;
}
void SessionTask::notify()
{
    pthread_cond_signal(&result_cond);
}

 

在FrontServer的Request阶段 ,调用task->lock_and_wait(1000) // 1s超时

在结果计算出来的Response阶段,调用task->notify(); 

在这个过程中,需要注意单位的转换。

在之前的server中,还有一种比较私有的方法,个人感觉不如这种方便,而且Http也更标准化些。

 

转载于:https://www.cnblogs.com/westfly/p/4032568.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值