• C# Thread.Sleep问题


    C# Thread.Sleep 不精准的问题以及解决方案

    1.问题

     

    最近在写一个熔断的 SDK,其中一种策略是根据慢请求来进行熔断。

     

    我们在测试的时候,在对应 API 里面采用了 Thread.Sleep(ms) 来模拟慢请求。

     

    设置的慢请求阈值是 RT 100ms,我们设置了 Thread.Sleep(90ms),但是发现竟然触发了熔断。最近分析发现是 Thread.Sleep 并不精准,在测试机器(Windows 10)上偏差最大超过了 10ms,在我自己的电脑上(Mac)偏差最大 5ms。

     

    为什么会这样呢?“因为Thread.Sleep保证的是至少休眠指定的值”(来自时总的解答 https://www.cnblogs.com/InCerry)

     

    这不是 C# 的问题,JAVA 也一样。

     

     

     

    编写了 JAVA 代码,发现结果在我的机器上和 C# 是一样的,最大偏差 5ms。

     

    这个偏差和机器CPU、负载、Sleep 时间、操作系统有关。

     

    2.解决

     

    如何解决这个问题?我尝试降低 Sleep 时间,通过循环计时,发现这个方法的精准度挺高的。

     

    static void Sleep(int ms)
    {
        var sw = Stopwatch.StartNew();
        var sleepMs = ms - 16;
        if (sleepMs > 0)
        {
            Thread.Sleep(sleepMs);
        }
        while (sw.ElapsedMilliseconds < ms)
        {
            Thread.Sleep(0);
        }
    }
    

     

    经过了时总的优化

     

    上面的代码运行测试:

     

     

  • 相关阅读:
    awk书上练习
    矩阵运算
    从最大似然到EM算法浅解
    numpy 练习
    python lxml教程
    pycharm快捷键
    python正则表达式教程
    三门问题
    Solr本地服务器搭建及查询
    git简单使用
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/16614922.html
Copyright © 2020-2023  润新知