time.Sleep在VM上睡眠时间不正确

时间:2017-09-18 16:49:24

标签: go

我正在运行以下代码:https://play.golang.org/p/5bhXs_QulH

/opt/sybase/config

当我在笔记本电脑或操场上运行时,我得到了:

package main

import (
"fmt"
"time"
)

func main() {
    startTime := time.Now()
    foo := 0.200
    fmt.Println(int((time.Now().UnixNano() - startTime.UnixNano()) / int64(time.Millisecond)))
    time.Sleep(time.Duration(foo*1000) * time.Millisecond)
    fmt.Println(int((time.Now().UnixNano() - startTime.UnixNano()) / int64(time.Millisecond)))
}

但是当我在虚拟机(VM)上运行它时,我得到:

0
200

我不是100%确定VM分配到哪个基础架构,但它是整个公司的企业基础架构,我认为它是VMWare。

有人能解释物理机和虚拟机之间的测量差异以及如何克服它并获得一致的睡眠时间吗?

1 个答案:

答案 0 :(得分:-2)

我最终想出了以下内容:

func SleepMilliseconds(duration int, limit int) {
   startTime := time.Now()
   tempDuration := duration
   for {
      tempDuration = tempDuration / 2
      time.Sleep(time.Duration(tempDuration) * time.Millisecond)
      elapsed := int((time.Now().UnixNano() - startTime.UnixNano()) / int64(time.Millisecond))
      tempDuration = duration - elapsed
      if tempDuration < limit {
          break
      }
  }
}

免责声明:我不认为这是一个合适的解决方案,也不会在我的项目中使用它,我只是把它放在极少数情况下,你的生活(或生产环境)是依赖的立即解决方案,你不知道还能做什么。