使用goroutine运行同一程序的另一个实例?

时间:2019-03-15 01:30:19

标签: multithreading go goroutine

使用goroutines运行同一个go程序的多个实例(例如运行go main())是否可以接受?

如果是这样,是否可以修改发送到goroutine(或os.Args [])的参数,以使main()函数不会创建无限数量的goroutine? 然后,goroutine应当能够通过通道相互通信。我知道goroutine共享相同的内存空间,但是具有单独的堆栈,因此这可能会导致某些竞争条件问题。

或者,也许这是对Goroutines的不当使用,我应该坚持使用exec.Command()执行该可执行文件的另一个实例,并让这些实例通过JSON-RPC进行通信。

感谢您的帮助。

1 个答案:

答案 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
}