Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么goroutines上没有`.join`操作?_Go_Goroutine - Fatal编程技术网

为什么goroutines上没有`.join`操作?

为什么goroutines上没有`.join`操作?,go,goroutine,Go,Goroutine,为什么goroutines上没有.join操作(即阻塞直到完成)操作?而不是在主goroutine中使用通道进行通信 我觉得我错过了CSP的一些基本理论 编辑: 我问的是“为什么会这样”,而不是“我如何做到这一点”。这只是因为goroutine不是线程。给定的goroutine可以由Go运行时安排与操作系统线程关联,但例如,在阻塞I/O操作的情况下,所述线程可以在另一个goroutine等待时与其他goroutine关联 这是什么意思 连接需要一个同步对象,以便知道线程何时完成。由于Go的Gor

为什么goroutines上没有
.join
操作(即阻塞直到完成)操作?而不是在主goroutine中使用通道进行通信

我觉得我错过了CSP的一些基本理论

编辑:
我问的是“为什么会这样”,而不是“我如何做到这一点”。这只是因为goroutine不是线程。给定的goroutine可以由Go运行时安排与操作系统线程关联,但例如,在阻塞I/O操作的情况下,所述线程可以在另一个goroutine等待时与其他goroutine关联

这是什么意思

连接需要一个同步对象,以便知道线程何时完成。由于Go的Goroutine实际上只是非常轻量级的对象,只拥有一个堆栈,所以它们不直接提供这样的同步对象

Go的CSP前提是,您可以非常便宜地实例化数千个GoRoutine,并且只使用物理CPU核心所需的线程数。 从操作系统的角度来看,同步对象非常昂贵,因此为每个goroutine提供这样的对象将非常低效

相反,同步是通过使用同步包中的通道或WaitGroup来实现的。

后续

下面是一个简单的示例,演示如何使用
sync.Mutex
执行此操作。我在这里选择了一个
sync.Mutex
而不是
sync.WaitGroup
,因为我只打算让每个
线程
对象包装一个goroutine,而WaitGroup则打算与多个goroutine一起使用

类型线程结构{
body func()
多路复用器同步。互斥
}
func NewThread(body func())*线程{
返回和线程{
身体:身体,,
}
}
func(线程*线程)开始(){
thread.mux.Lock()
运行线程
}
func(线程*线程)连接(){
thread.mux.Lock()
thread.mux.Unlock()
}
func(线程*线程)运行(){
thread.body()
thread.mux.Unlock()
}
你可以这样使用它

func main(){
t:=NewThread(t1)
t、 开始()
t、 加入
打印(“线程1:已连接\n”)
}
func t1(){
打印(“线程1:已启动\n”)
时间。睡眠(5*时间。秒)
打印(“线程1:已完成\n”)
}

您看过吗?它有等待线程终止的原语(尽管据我所知,这不是在Golang中工作的首选方式)。但无论如何,我要问的是为什么而不是如何。如果有办法的话,这会让你的问题变得毫无意义。好吧,我一直在寻找一个像我得到并接受的答案那样的解释。老实说,这个问题表面上看起来很有道理,但a)你可以开箱即用地启动goroutine(根本不引用任何库),b)你不能在不引用库/包的情况下等待/加入goroutine。这种不匹配是因为这实际上是一种基本的操作—w.r.t.并发程序—如果没有“某种黑客”你就无法做到这一点,这是合理的。谢谢你。我接受这个答案。(真不敢相信我被可能连这个都不知道的人6次投票否决了。)在我看来,这是一个完全可以接受和合理的问题,突出了语言的一个基本方面:)我想说,这与goroutines不是线程没有任何关系,它植根于这样一个事实:使goroutine不可识别或寻址是一种设计选择。从理论上讲,运行时可以提供连接,因为它可以确定goroutine何时返回,但不能“连接”无法获得引用的内容。