wtysos11 / blogWiki

Use to store public paper and organize them.
17 stars 4 forks source link

go-无限执行的goroutine的管理 #216

Open wtysos11 opened 3 years ago

wtysos11 commented 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?