重新启动go例程的惯用方法

我有两个 go 例程执行两个长时间运行的任务。在某些情况下,这些例程可能会出错。我想看看是否有办法在例程出错后重新启动它们。如果例程被取消,我还必须避免重新启动。

我现在添加了以下代码。请建议这是否是一种惯用的方法。

func f1(ctx context.Context) error {
    fmt.Println("[f1] start")
    select {
    case <-ctx.Done():
        fmt.Println("[f1] graceful exit")
        return nil
    }
}

func f2(ctx context.Context) error {
    fmt.Println("[f2] start")
    select {
    case <-time.After(1 * time.Second):
        // simulating an error condition
        fmt.Println("[f2] errored exit")
        return fmt.Errorf("error")
    case <-ctx.Done():
        fmt.Println("[f2] graceful exit")
        return nil
    }
}

func manage(ctx context.Context, f func(ctx context.Context) error) {
    for {
        err := f(ctx)
        if err == nil {
            return
        }
        <-time.After(1 * time.Second)
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    go manage(ctx, f1)
    go manage(ctx, f2)

    // delay to see the exeution
    <-time.After(5 * time.Second)
    cancel()
    <-time.After(5 * time.Second)
}

回答

没有惯用的方法来做到这一点。Go 例程不会随意死掉,需要重新启动。

要么处理 go 例程内部的错误并防止其结束,要么将错误传达回例程启动的点,在那里处理它,然后在不同的输入上重新运​​行 go 例程(如果合适)。


以上是重新启动go例程的惯用方法的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>