MST

星途 面试题库

面试题:Go程序崩溃恢复机制在并发场景下的应用

在Go语言的并发编程中,goroutine之间是相对独立运行的。当某个goroutine发生panic时,如何在不影响其他goroutine正常运行的前提下,对该goroutine进行崩溃恢复?请结合sync包相关知识进行分析,并给出代码示例。
47.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

在Go语言中,可以使用deferrecover来捕获并恢复panic。结合sync包中的WaitGroup来等待所有goroutine完成。以下是代码示例:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()

    defer func() {
        if r := recover(); r != nil {
            fmt.Printf("goroutine %d panicked: %v\n", id, r)
        }
    }()

    // 模拟可能发生panic的操作
    if id == 2 {
        panic("simulated panic")
    }
    fmt.Printf("goroutine %d is running\n", id)
}

func main() {
    var wg sync.WaitGroup
    numGoroutines := 3

    for i := 1; i <= numGoroutines; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    wg.Wait()
    fmt.Println("All goroutines have finished")
}

代码分析

  1. worker函数
    • defer wg.Done():在goroutine结束时,通知WaitGroupgoroutine已完成。
    • 使用deferrecoverdefer函数会在worker函数结束时执行,recover会捕获到panic,并输出错误信息,从而恢复goroutine的运行,不影响其他goroutine
  2. main函数
    • 使用WaitGroup来等待所有goroutine完成。
    • 启动多个goroutine执行worker函数,worker函数内部模拟了可能发生panic的情况。
    • 当所有goroutine完成后,main函数输出“All goroutines have finished”。