Как лучше всего поддерживать работу долго работающей программы Go?

У меня есть давно работающий сервер, написанный на Go. Main запускает несколько горутин, в которых выполняется логика программы. После этого main ничего полезного не делает. Как только main выйдет, программа закроется. Метод, который я сейчас использую для поддержания работы программы, — это простой вызов fmt.Scanln(). Я хотел бы знать, как другие удерживают main от выхода. Ниже приведен базовый пример. Какие идеи или лучшие практики можно было бы здесь использовать?

Я думал о создании канала и отсрочке выхода из main путем получения на указанном канале, но я думаю, что это может быть проблематично, если все мои горутины в какой-то момент станут неактивными.

Примечание: на моем сервере (не в примере) программа на самом деле не подключена к оболочке, поэтому в любом случае не имеет смысла взаимодействовать с консолью. Пока это работает, но я ищу «правильный» способ, если он есть.

package main

import (
    "fmt"
    "time"
)

func main() {
    go forever()
    //Keep this goroutine from exiting
    //so that the program doesn't end.
    //This is the focus of my question.
    fmt.Scanln()
}

func forever() {
    for ; ; {
    //An example goroutine that might run
    //indefinitely. In actual implementation
    //it might block on a chanel receive instead
    //of time.Sleep for example.
        fmt.Printf("%v+\n", time.Now())
        time.Sleep(time.Second)
    }
}
41
задан Nate 3 March 2012 в 06:23
поделиться