Как «поддерживать работу основного потока», даже если в программе «Ошибка времени выполнения» в Golang произошла ошибка? - PullRequest
0 голосов
/ 19 сентября 2018

Я новичок в Голанде и раньше занимался Java.Я написал функцию Голанга для вычисления части результата с целым числом.Я думаю об использовании таймера для вычисления и генерации случайного числа.Но я столкнулся с одной проблемой: если в подпрограмме есть какая-то ошибка, основной поток остановится.Есть ли способ сохранить работоспособность основного потока?Даже если в процедуре есть ошибки?

Ниже приведен код для теста:

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 в отдельном потоке, основной прогресс не завершится, но для Голанга ядумаю, что

go calculate(divisor)

открывает новый «поток» и запускает вычисление внутри «потока», но почему основной прогресс завершится.Есть ли какой-нибудь способ предотвратить выход основного прогресса?

Спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

использовать функцию отсрочки / восстановления

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)
}
...