zoukankan      html  css  js  c++  java
  • 异步执行同步等待结果

    需求:

    我们的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也更标准化些。

  • 相关阅读:
    一致性哈希算法
    Tcp 3次握手 4次挥手
    计算机字符编码编年史
    虚拟机字节码指令表 JVM
    计算机是如何计算的、运行时栈帧分析(神奇i++续)
    神奇的i++
    记一次 springboot 参数解析 bug调试 HandlerMethodArgumentResolver
    String+、intern()、字符串常量池
    签名和加密的区别(详细)
    java之设计模式汇总
  • 原文地址:https://www.cnblogs.com/westfly/p/4032568.html
Copyright © 2011-2022 走看看