Запуск другого экземпляра той же программы с Goroutine? - PullRequest
1 голос
/ 15 марта 2019

Является ли приемлемой практика запускать несколько экземпляров одной и той же программы go с помощью goroutines, например, запустить go main ()?

Если это так, возможно ли изменить аргументы, отправленные в программу (или os.Args []), таким образом, чтобы функция main () не создавала бесконечное количество программ? Затем горутины должны иметь возможность общаться друг с другом по каналам. Я понимаю, что подпрограммы разделяют одно и то же пространство памяти, но имеют отдельные стеки, так что это может вызвать проблемы с состоянием гонки.

Или, возможно, это неправильное использование Goroutines, и я должен просто придерживаться exec.Command (), чтобы выполнить другой экземпляр исполняемого файла, и заставить эти экземпляры взаимодействовать через JSON-RPC.

Спасибо за помощь.

1 Ответ

2 голосов
/ 15 марта 2019

Я не уверен, что вы понимаете, как работает goroutine . Думайте об этом как о виртуальном потоке, так как это практически альтернатива Go на практике. Когда вы вызываете go foo(), вы порождаете в своем исполняемом файле программу (или виртуальный поток) так же, как поток в других языках, а не отдельный процесс как exec или syscall.ForkExec ().

Надлежащая практика в Go - придерживаться единого процесса и использовать goroutines для одновременных обязанностей. Например, если вы пишете свой собственный прослушиватель порта и хотите, чтобы каждый прослушиватель на другом порту выполнял несколько итераций, ваш план может быть следующим:

func APIHandler(port int) {
    // do stuff
}

func main() {
    go APIHandler(80)
    go APIHandler(81)
    go APIHandler(82)

    // sync.WaitGroup, or maybe wait on an error chan
}
...