使用goroutines运行同一个go程序的多个实例(例如运行go main())是否可以接受?
如果是这样,是否可以修改发送到goroutine(或os.Args [])的参数,以使main()函数不会创建无限数量的goroutine? 然后,goroutine应当能够通过通道相互通信。我知道goroutine共享相同的内存空间,但是具有单独的堆栈,因此这可能会导致某些竞争条件问题。
或者,也许这是对Goroutines的不当使用,我应该坚持使用exec.Command()执行该可执行文件的另一个实例,并让这些实例通过JSON-RPC进行通信。
感谢您的帮助。
答案 0 :(得分:2)
我不确定您是否在这里了解 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
}