最近遇到一个难题,求助一下各位大神。 如下面部分代码所示。 computedata 内部 调用的dosomething函数是一个很耗时的函数,通过复杂的计算返回一个结果,用于其他函数计算。但是dosomething 函数在一秒之内,仍然没有返回结果。那么就直接超时,timeout掉。 但是目前遇到的困难是 即使我们这个computedata函数杀死,dosomething函数让着后台运行,该函数会修改一些全局函数,下次调用是,会影响下次的计算结果,因此必须彻底杀死,如何才能杀死它呢?求助高手?
```go
func main() {
computedata()
for{
}
}
func computedata() {
var c = make(chan int,1)
time := time.Now().Add(time.Second*1)
ctx, cancel := context.WithDeadline(context.Background(),time)
defer cancel()
go dosomething(c)
select {
case <-ctx.Done():
fmt.Println("time out.")
return
case data :=<-c:
fmt.Println(data)
return
}
}
```
default分支的计算很耗时的话,它就一直占着cpu,即便ctx.Done()有消息也不能得到执行
可以试着分割realdosomething的操作 同时在realdosomething之前保留状态,如果最后是ctx.Done()执行了,就恢复现场
#5
更多评论
go dosomething() 怎么没把ctx带过去。。ctx不就是做这个事的么
然后select{} 在dosomething里做,就能在timeout到了之后return,结束这个goroutine了
#1
你的意思是这个吗? 但是realdosometing 一直占用cpu啊。不能走到 done的那个分支啊? 求指教。
```go
func dosomething(ctx){
select {
case <-ctx.Done():
fmt.Println("time out.")
default: // realdosomething
}
}
```
#2