-
package main
-
-
import "fmt"
-
import "sync"
-
import "time"
-
import "context"
-
import "math/rand"
-
func work(ctx context.Context) {
-
resultChan := make(chan int,1)
-
var wg sync.WaitGroup
-
wg.Add(1)
-
defer wg.Wait()
-
go func() {
-
defer func(){
-
recover()
-
}()
-
defer close(resultChan)
-
r := rand.New(rand.NewSource(time.Now().UnixNano()))
-
num := r.Intn(3)
-
time.Sleep(time.Duration(num)*time.Second)
-
fmt.Printf("任务执行了%d s \n",num)
-
-
resultChan <- 1
-
wg.Done()
-
}()
-
select{
-
case <-ctx.Done():
-
fmt.Println("超时结束")
-
case <-resultChan:
-
fmt.Println("正常结束")
-
}
-
}
-
func main() {
-
ctx,cancel := context.WithTimeout(context.Background(),time.Second*2)
-
defer cancel()
-
work(ctx)
-
}
此处实现了超时控制,但是超时后无法立即终止超时的go协程.
考虑在任务中添加
-
time.AfterFunc(2*time.Second,func() {
-
//退出协程
-
fmt.Println("超时了...")
-
runtime.Goexit()
-
})
通过该处来控制 go协程退出,实验发现该处为异步调用,退出的非当前的go协程.
在一个协程中无法直接停止另一个协程的执行,只能等待超时的协程自己执行结束.
阅读(1274) | 评论(0) | 转发(0) |