3 回答
TA贡献1801条经验 获得超8个赞
context.Context自从我从事 Go 工作以来已经有一段时间了,但我尝试使用and让它工作sync.Once。我还没有测试过这个。
func keepConnUp(n netAddr, w chan<- io.Writer, err chan error) {
addr := fmt.Sprintf("%s:%d", n.Addr, n.Port)
done := make(chan bool)
ctx, cancel := context.WithCancel(context.Background())
cancel() // So that ctx.Err() returns non-nil on the first try
once := sync.Once{}
for {
<-err
if ctx.Err() != nil {
once.Do(func() {
conn, _ := net.Dial(n.Network, addr)
w <- conn
})
once = sync.Once{} // Reset once
ctx = context.WithTimeout(reconnectTimer) // Reset context timeout
}
}
}
TA贡献1829条经验 获得超7个赞
type Conn struct {
conn net.Conn
dialing bool
mu sync.Mutex
}
func (c Conn) Dial() {
c.mu.Lock()
if c.dialing {
c.mu.Unlock()
return
}
c.dialing = true
c.mu.Unlock()
time.AfterFunc(reconnectTimer, func() {
c.conn, _ := net.Dial(n.Network, addr)
w <- c.conn
c.dialing = false
})
}
现在你可以调用Conn.Dial()一个 goroutine
- 3 回答
- 0 关注
- 105 浏览
添加回答
举报