Функция прослушивания и обслуживания блокирует выполнение основного процесса, никогда не достигает следующего состояния выбора, используемого для связи - PullRequest
0 голосов
/ 11 мая 2018

Все еще полностью разбираюсь в программах и каналах, так что я могу делать что-то явно не так.У меня есть служба, которая запускает сервер веб-сокетов и общий маршрут, используемый для обновления клиентов с https до wss.Я пытаюсь прикрепить некоторый код для одной из подпрограмм, но второй вызов go, кажется, блокирует выполнение основной функции.Я достигаю Println 5 на консоли при загрузке.Остальная часть моей программы успешно работает.Я просто не могу убить его с помощью ctrl + C (и при этом не требуется, это необходимо разрушить после ручного выключения).

Вот соответствующий код (полный основной файл без минус streamAddr var и импорта):

func main() {
    fmt.Println(1)
    flag.Parse()
    log.SetFlags(0)

    fmt.Println(2)
    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    fmt.Println(3)
    hub := socktools.NewHub()
    go hub.Run()

    fmt.Println(4)
    http.HandleFunc("/stream", func(w http.ResponseWriter, r *http.Request) {
        socktools.ServeWs(hub, w, r)
    })

    fmt.Println(5)
    go log.Fatal(http.ListenAndServe(*streamAddr, nil))

    fmt.Println(6)

    select {
    case <-interrupt:
        fmt.Println("Interrupt heard...")
        close(hub.KillChan)
        <-hub.KilledChan
        fmt.Println("Ending main function")
        return
   }
}

Почему go log.Fatal(http.ListenAndServe(*streamAddr, nil)) блокируется?Я думал, что ключевое слово go мгновенно сделало его асинхронным?Я здесь неправильно использую?

1 Ответ

0 голосов
/ 11 мая 2018

Вы, по сути, звоните go log.Fatal(variable), поэтому асинхронный вызов log.Fatal, но он должен знать, что variable является в тот момент , поэтому сначала он должен вызвать http.ListenAndServeпосмотрим, что он вернет.Но http.ListenAndServe блоков.

Вам нужно сделать:

go func() {
    log.Fatal(http.ListenAndServe(*streamAddr, nil))
}()
...