Может ли инициировать выполнение программы (то есть, вызывать «идти») неудачно? - PullRequest
0 голосов
/ 08 апреля 2019

Возможен ли сбой при выполнении go f?

Поскольку ключевое слово go не имеет возвращаемого значения, как определить, успешно ли запущена программа в течение высокого параллелизма?

Например:

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    var wg = &sync.WaitGroup{}
    go func() { // How do I know if there is any failure here?
        wg.Add(1)
        fmt.Println("halo world")
        wg.Done()
    }()
    time.Sleep(time.Nanosecond)
    wg.Wait()
}

1 Ответ

4 голосов
/ 08 апреля 2019

Оператор go не может завершиться ошибкой (только в «экстремальных» обстоятельствах, например, из-за нехватки памяти, но в противном случае оператор go будет наименьшей из ваших проблем).

Конечно, без синхронизации у вас нет гарантии, когда запланировано выполнение этой программы. Таким образом, ваше примерное использование sync.WaitGroup неверно, так как если бы подпрограмма не была запланирована до тех пор, пока main не достигнет wg.Wait(), она может даже никогда не начаться, как, когда заканчивается подпрограмма main, ваша программа также заканчивается.

Вместо этого увеличьте счетчик WaitGroup в главной программе (и лучше всего вызвать WaitGroup.Done() deferred, поэтому он вызывается, даже если программа запаникует):

var wg = &sync.WaitGroup{}
wg.Add(1)
go func() {
    defer wg.Done()
    fmt.Println("halo world")
}()
wg.Wait()

Таким образом, вам даже не нужен сон, wg.Wait() будет блокироваться, пока другая программа не вызовет wg.Done() (что произойдет, только когда другая программа завершит свою работу).

...