gpt4 book ai didi

go - Golang无限循环超时

转载 作者:行者123 更新时间:2023-12-01 22:20:08 26 4
gpt4 key购买 nike

我正在尝试读取恒定的数据流,如果调用接收流的时间超过30秒,则需要超时并退出程序。我不确定收到超时后如何退出go例程。

func ReceiveStreamMessages(strm Stream, msg chan<- []byte) error {
d := make(chan []byte, 1)

e := make(chan error)

tm := time.After(30 * time.Second)

go func() {
for {
//blocking call
data, err := strm.Recv()
if err != nil {
e <- err
return
}
select {
case d <- data.Result:
case <-tm:
//exit out go routine
return
}
}
}()

for {
select {
case message := <-d:
msg <- message
case err := <-e:
return err
case <-tm:
return nil
}
}
}
我上面的代码是错误的,因为:为了使 select在go例程中运行以进行循环,阻塞函数将必须返回并且数据将被填充,因此不会达到超时选择的情况(或者将随机执行将准备就绪)。退出父函数是否足以退出go例程?

最佳答案

使用contextWithTimeout。像这样:

package main

import (
"context"
"fmt"
"sync"
"time"
)

func main() {
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
// prepare
...
// wait group just for test
var wg sync.WaitGroup
wg.Add(1)
go func() {
for {
select {
case d <- data.Result:
// do something
case <-ctx.Done():
fmt.Println("Done")
wg.Done()
return
}
}
}()
wg.Wait()
cancel()
fmt.Println("Hello, playground")
}
您可以在这里看到一个工作示例 https://play.golang.org/p/agi1fimtEkJ

关于go - Golang无限循环超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64008452/

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