首页 > 代码库 > 异步执行同步等待结果
异步执行同步等待结果
需求:
我们的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也更标准化些。
异步执行同步等待结果
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。