即使例程在Golang中发生了“运行时错误”,也该如何“保持主线程运行”?

时间:2018-09-19 03:53:15

标签: multithreading go timer goroutine

我是Goland的新手,过去我曾经做过Java。我写了一个Golang函数来计算结果的整数部分。我在想使用计时器进行计算并生成随机数。但是我遇到的一个问题是,如果例程有一些错误,则主线程将停止。有什么办法可以保持主线程运行?即使例行程序中有错误?

下面是测试代码:

func main() {
    ticker := time.NewTicker(1*1000 * time.Millisecond)
    for _ = range ticker.C {
        rand.Seed(time.Now().Unix())
        divisor := rand.Intn(20)
        go calculate(divisor)
    }
}

func calculate(divisor int){
    result:= 100/divisor
    fmt.Print("1/"+strconv.Itoa(divisor)+"=")
    fmt.Println(result)
}

由于Golang的错误处理确实让我感到困惑,因为我想的是错误发生在“线程”中,所以主要功能只是负责创建线程和分配任务,所以不要介意是否有异常发生在“线程”中,并且main应该一直保持下去。如果我使用Java进行此操作,则可以使用try catch加上

try{
    result = 1/divisor;
}
catch(Exception e){
    e.printTrace();
}

即使我每次在单独的线程中为除数提供0值,主进程也不会退出,但是对于Golang,我认为

go calculate(divisor)

正在打开一个新的“线程”并运行计算 里面的“线程”,但是为什么主要的进度会退出。 有什么方法可以阻止主要进度退出?

谢谢。

1 个答案:

答案 0 :(得分:2)

使用延迟/恢复功能

package main

import (
    "fmt"
    "time"
    "math/rand"
)

func main() {

    ticker := time.NewTicker(1*1000 * time.Millisecond)
    for _ = range ticker.C {
        rand.Seed(time.Now().Unix())
        divisor := rand.Intn(20)
        go calculate(divisor)
    }
fmt.Println("that's all")
}



func calculate(divisor int){
defer func() {
        if r := recover(); r != nil {
            fmt.Println("Recovered in f", r)
        }
    }()
    result:= 100/divisor
    fmt.Printf("1/%d=", divisor)
    fmt.Println(result)
}