Go Concurrent Timing out, moving on

這篇我主要看中的 time.After 的實作想法 以及…

Timing out, moving on

time.Sleep
1
2
3
4
5
6
7
8
9
10
11
12
timeout := make(chan bool, 1)
go func() {
time.Sleep(1 * time.Second)
timeout <- true
}()

select {
case <-ch:
// a read from ch has occurred
case <-timeout:
// the read from ch has timed out
}

在實際狀況你應該使用 time.After,他會返回一個 channel,並且在你指定的時間後發出 signal

Timing out, moving on
1
2
3
4
5
6
7
8
9
10
11
12
func Query(conns []Conn, query string) Result {
ch := make(chan Result, 1)
for _, conn := range conns {
go func(c Conn) {
select {
case ch <- c.DoQuery(query):
default:
}
}(conn)
}
return <-ch
}

我們只要確保 channel 有足夠空間塞入第一個值。

這會確保可以成功送進 channel,並且第一個值會被順利拿出來,且不用管他們的執行順序