我是golang的新手,我正在尝试使用goroutine,虽然同时运行它很容易,但我对golang"加入线程"的方式感到有些惊讶WaitGroup.
据我所知,goroutine需要引用WaitGroup对象来调用Done(),这意味着,我必须让goroutine接受一个WaitGroup对象,或者让WaitGroup对象全局到goroutine.
但是在Python之类的其他语言中,你称之为thread.join()"控制"部分位于线程代码之外.
就像我说的那样,我对golang很新,我不知道为什么它是这样设计的,有人可以就这方面有所了解吗?
更新:我希望这个论点不是基于'Goroutine vs Thread',在一天结束时他们都试图实现(某种)'并发',我的问题更多的是关于控制程序流程.
为什么它是这样设计的
这实际上已经被golang团队多次解释了 - 为什么我们不能杀死goroutines,为什么他们没有我们可以阅读的ID,为什么我们不能像线程一样明确地等待goroutine Join.
它被多次解释但我只能找到这个.基本上,作者不希望你依赖于线程局部性 - 锁定特定的线程/ goroutine,只为它拥有本地存储等等.当你没有任何方法可以知道你在哪个goroutine中让你被迫以一种真正的方式设计你的应用程序.您的代码由真正独立的部分组成,这些部分运行得很精确,而且他们并不关心究竟如何.您不关心哪个goroutine选择您的代码,您不关心哪个OS线程正在运行您的代码.这就是频道,精选和其他原语的用武之地.它们可以帮助您以这种方式构建应用程序.我相信它并不止于此.