使用 goroutines 运行同一个 go 程序的多个实例是否是一种可接受的做法,例如运行 go main()?
如果是这样,是否可以修改发送到 goroutine(或 os.Args[])的参数,以便 main() 函数不会创建无限数量的 goroutine? 然后 goroutines 应该能够通过 channel 相互通信。我知道 goroutines 共享相同的内存空间但有单独的堆栈,因此这可能会导致一些竞争条件问题。
或者,也许,这是对 Goroutines 的不当使用,我应该坚持使用 exec.Command() 来执行可执行文件的另一个实例,并让这些实例通过 JSON-RPC 进行通信。
感谢您的协助。
最佳答案
我不确定您是否理解 goroutine 在这里是如何工作的。把它想象成一个虚拟线程,因为在实践中它几乎是 Go 的线程替代品。当您调用 go foo()
时,您将在可执行文件中生成一个 goroutine(或虚拟线程),就像在其他语言中生成一个线程一样,而不是像 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
}
关于multithreading - 使用 goroutine 运行同一程序的另一个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55174349/