go - 如何制作更好的超时功能

标签 go timeout raft

我使用的是 time.After(time),它工作正常。

我的问题是:它是否精确,我应该使用它还是应该制作自己的函数?我将其与 Raft 共识算法实现一起使用。

最佳答案

我猜你是说 time.After

我写了一个快速基准来回答这个问题。

使用 go test -run XXX -bench 运行。 time_after_test.go

package main

import (
    "testing"
    "time"
)

func BenchmarkTimeAfterSecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Second)
    }
}

func BenchmarkTimeAfterMillisecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Millisecond)
    }
}

func BenchmarkTimeAfterMicrosecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Microsecond)
    }
}

func BenchmarkTimeAfterNanosecond(b *testing.B) {
    for i := 0; i < b.N; i++ {
        <-time.After(time.Nanosecond)
    }
}

这是在 linux amd64 机器上的 go1.2 下给出的

BenchmarkTimeAfterSecond                   1    1000132210 ns/op
BenchmarkTimeAfterMillisecond           2000       1106763 ns/op
BenchmarkTimeAfterMicrosecond          50000         62649 ns/op
BenchmarkTimeAfterNanosecond         5000000           493 ns/op

所以在我的机器上答案精确到 0.1-0.2 毫秒左右。

这在很大程度上取决于操作系统和硬件,因此会因您选择的操作系统和硬件而异。

关于go - 如何制作更好的超时功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22266401/

相关文章:

go - 如何避免在 Go 中重复自己?

go - "go get -t ./...",Travis CI,并安装所有 go 依赖项

sockets - 从未知长度的 UDP 套接字读取数据

javascript 窗口在 15 分钟后关闭

distributed-computing - CRDT 和 RAFT 协议(protocol)之间是否存在关系——或者它们是正交的?

algorithm - 服务器中 volatile 状态的 raft 协议(protocol)中的 lastApplied 和 matchIndex 是什么?

ssl - Corda RAFT TLS V1

google-app-engine - 将 appengine 与 arch 和 zsh 一起使用无法找到 goapp

mysql - 如果需要太长时间,如何停止 MySQL 查询?

c++ - asio::read with timeout