Golang Go语言中请教一个 context 同步问题

发布于 1周前 作者 wuwangju 来自 Go语言

Golang Go语言中请教一个 context 同步问题

ewjIBQ.png

ewv3gf.png

请教各位一个问题,context 超时控制,需要控制任务超时处理。

这个真正在干活的任务如果耗时太长,导致达到超时时间,此时 context 发送 timeout 消息给 task 函数,

此时,task 函数退出了。可是这个真正干活的协程 还是会继续运行。

我如何能控制干活的携程也可以跟随 context 的信号退出呢?

是我理解有问题,还是例子不对呢?


更多关于Golang Go语言中请教一个 context 同步问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

把 ctx 再传入 go func 里不就可以

更多关于Golang Go语言中请教一个 context 同步问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go<br>// goroutineExample2 使用 done 信号来通知 goroutine 退出<br>// channel 上接收 goroutine。<br>func goroutineExample2() {<br> doWork := func(<br> done &lt;-chan interface{}, strings &lt;-chan interface{},<br> ) &lt;-chan interface{} {<br> terminated := make(chan interface{})<br> go func() {<br> defer fmt.Println("doWork exited.")<br> defer close(terminated)<br> for {<br> select {<br> case s := &lt;-strings:<br> fmt.Println(s)<br> case &lt;-done:<br> return<br> }<br> }<br> }()<br> return terminated<br> }<br><br> done := make(chan interface{})<br> terminated := doWork(done, nil)<br><br> go func() {<br> fmt.Println("Canceling doWork goroutine ...")<br> time.Sleep(10 * time.Second)<br> close(done)<br> }()<br> &lt;-terminated<br> fmt.Println("Done.")<br>}<br><br>

这个示例函数有帮助吗?

1、主协程退出,其他子协程全都退出
2、想达到超时控制回收全部子协程。直接从顶层到底层一直传 context 就 ok 了

context 本来就是为了解决树形 goroutine 的同步和控制问题

你理解有问题,ctx 是给最里面那个 goroutine 用的,就是所有需要监听超时的,都需要 <-ctx.Done()

在Go语言中,context包主要用于在goroutines之间传递截止日期、取消信号以及其他请求范围内的值。对于你提到的context同步问题,通常需要注意以下几点:

  1. Context的传递:确保在需要的地方正确传递context对象。context应该沿着请求的路径向下传递,确保每个goroutine都能访问到它。

  2. 取消和超时context.WithCancelcontext.WithTimeoutcontext.WithDeadline可以用来创建带有取消或超时功能的context。当需要取消操作或操作超时时,可以通过这些context来实现。

  3. Select语句:在goroutine中,可以使用select语句来监听多个channel或context的Done信号。当context被取消或超时时,Done channel会被关闭,从而触发相应的处理逻辑。

  4. 避免数据竞争:虽然context本身不是用来解决数据竞争问题的,但在使用context传递数据时,需要确保数据的访问是并发安全的。可以使用互斥锁(sync.Mutex)、原子操作等同步机制来保护数据。

  5. 正确使用context.Valuecontext.Value用于传递请求范围内的值,但应谨慎使用,避免滥用导致代码难以维护。

总的来说,context在Go中主要用于控制goroutines的生命周期和传递请求范围内的值,但同步问题更多依赖于Go的并发原语(如channel、互斥锁等)来解决。确保正确使用context和其他同步机制,可以编写出高效且健壮的Go程序。

回到顶部