gpt4 book ai didi

Golang 为什么这个超时方案不起作用?

转载 作者:IT王子 更新时间:2023-10-29 01:36:06 31 4
gpt4 key购买 nike

所以我有这个用于发送消息的代码块。传递给 c.outChan 的消息被传输,如果收到 ack 作为返回,则“true”将通过 c.buffer[nr].signaler channel 传递。这似乎工作正常,但如果消息被丢弃(没有收到确认),而不是到达超时打印,它只是停止,我不知道为什么。这是代码:

func (c *uConnection) send(nr uint32) {
//transmitt message
c.outChan <- c.buffer[nr].msg
timeout := make(chan bool, 1)
go func() {
timeoutTimer := time.After(c.retransTime)
<-timeoutTimer
timeout <- true
}()
switch {
case <-c.buffer[nr].signaler:
fmt.Printf("Ack confirmed: %v\n", nr)
case <-timeout:
fmt.Println("-----------timeout-----------\n")
//resending
c.send(nr)
}
}

我做错了什么?

最佳答案

您正在为您的 channel 使用开关,但您需要一个选择。 switch 对 channel 一无所知,而只是尝试在选择之前评估 case 语句中的表达式。您当前的代码等效于此:

func (c *uConnection) send(nr uint32) {
//transmitt message
c.outChan <- c.buffer[nr].msg
timeout := make(chan bool, 1)
go func() {
timeoutTimer := time.After(c.retransTime)
<-timeoutTimer
timeout <- true
}()
tmp1 := <-c.buffer[nr].signaler // this will block
tmp2 := <-timeout
switch {
case tmp1 :
fmt.Printf("Ack confirmed: %v\n", nr)
case tmp2 :
fmt.Println("-----------timeout-----------\n")
//resending
c.send(nr)
}
}

您的代码应如下所示(使用 select 而不是 switch):

func (c *uConnection) send(nr uint32) {
//transmitt message
c.outChan <- c.buffer[nr].msg
timeout := make(chan bool, 1)
go func() {
timeoutTimer := time.After(c.retransTime)
<-timeoutTimer
timeout <- true
}()
select {
case <-c.buffer[nr].signaler:
fmt.Printf("Ack confirmed: %v\n", nr)
case <-timeout:
fmt.Println("-----------timeout-----------\n")
//resending
c.send(nr)
}
}

您的超时 goroutine 也是不必要的。而不是调用 time.After,在 channel 上等待,然后发送到您自己的超时 channel ,您可以直接等待 time.After。示例:

func (c *uConnection) send(nr uint32) {
//transmitt message
c.outChan <- c.buffer[nr].msg
select {
case <-c.buffer[nr].signaler:
fmt.Printf("Ack confirmed: %v\n", nr)
case <-time.After(c.retransTime):
fmt.Println("-----------timeout-----------\n")
//resending
c.send(nr)
}
}

这更快、更清晰并且使用更少的内存。

关于Golang 为什么这个超时方案不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36942072/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com