Open wtysos11 opened 3 years ago
最近做到一个需求,需要在任何情况下都要保证goroutine能正常工作并永久执行,因此在defer内加了东西。
package main import ( "fmt" "github.com/kataras/iris/v12" "strconv" ) func workIndefinitely(order int,s chan int){ defer func() { if err := recover(); err != nil{ fmt.Println("In recover: ",err) go workIndefinitely(order+1,s) } }() for ele:= range s{ if ele == 1{ panic(fmt.Errorf("function %v end",order)) }else{ fmt.Println("receive element",ele) } } } func main() { input := make(chan int,0) go workIndefinitely(0,input) app := iris.New() app.Get("/test", func(context iris.Context) { originStr := context.URLParamDefault("input","1") val,err := strconv.Atoi(originStr) if err != nil{ panic(err) } input <- val }) _ = app.Run(iris.Addr(":8080")) }
这个其实还是比较基础的,更进一步地想法是要支持动态对这些永久执行的goroutine的管理,目前能想到比较麻烦的就是需要调整goroutine的数量,可能需要加一个sync.Map之类的,每个goroutine退出之前自己把自己删掉?然后再加一个管理协程保证数量是恒定的? 或者可以考虑信号量的实现,通过外部操作调整信号量的大小,然后内部协程自适应地保证信号量一定为0?
最近做到一个需求,需要在任何情况下都要保证goroutine能正常工作并永久执行,因此在defer内加了东西。
这个其实还是比较基础的,更进一步地想法是要支持动态对这些永久执行的goroutine的管理,目前能想到比较麻烦的就是需要调整goroutine的数量,可能需要加一个sync.Map之类的,每个goroutine退出之前自己把自己删掉?然后再加一个管理协程保证数量是恒定的? 或者可以考虑信号量的实现,通过外部操作调整信号量的大小,然后内部协程自适应地保证信号量一定为0?