在我的应用程序中,我需要具有上下文取消支持的异步/等待模式。在实践中,我有一个类似的功能:
func longRunningTask() <-chan int32 {
r := make(chan int32)
go func() {
defer close(r)
// Simulate a workload.
time.Sleep(time.Second * 3)
r <- rand.Int31n(100)
}()
return r
}
但是,它不支持上下文取消。为了解决这个问题,我可以添加一个参数并修改函数以ctx.Done()在 select 语句中等待通道信号,如果上下文被取消则中止操作。
如果这样做,如果运行两次或更多次,函数将不会正确中止(因为上下文指针将被共享),因为上下文取消通道只接收一个信号:
ctx := ...
go func() { r := <-longRunningTask(ctx) } // Done() works
go func() { r := <-longRunningTask(ctx) } // ?
// cancel() ...
这是我看到的关于完成的内容:
// go/context.go
357 func (c *cancelCtx) Done() <-chan struct{} {
358 c.mu.Lock()
359 if c.done == nil {
360 c.done = make(chan struct{})
361 }
362 d := c.done
363 c.mu.Unlock()
364 return d
365 } // Done() returns the same channel for all callers, and cancellation signal is sent once only
go 源是否context真的不支持中止调用其他“长时间运行”函数的函数,“链式取消”?
有哪些选项可以编写支持在无限递归.Done()使用中取消上下文的异步函数?
qq_笑_17
有只小跳蛙
随时随地看视频慕课网APP
相关分类