我如何重叠 goroutines?
How can I overlap goroutines?
我有三个 gorutine,它们应该在某种循环中工作。例如,我有
go first() {
// do some stuff
}
go second() {
// do another kind of stuff
}
go third() {
// do third kind of stuff
}
他们必须这样工作:
第一-第二-第三-第一-/依此类推/
我想我必须为此使用频道,但我想不出正确的方法。
如果我制作三个不同的频道
第一到第二,
SeocndToThird,
ThirdToFirst,然后当我 运行 一个程序时,我得到错误:
fatal error: all goroutines are asleep - deadlock!
但是如果我去掉 ThirdToFirst,我就有了一个合适的循环,然后 gorutine 开始随机工作。
我当然漏掉了什么,但是什么?
带有两个 gorutine 的示例代码
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
ch1 := make(chan struct{})
ch2 := make(chan struct{})
go func() {
for _, value := range []int{1, 3, 5} {
<- ch1
fmt.Println(value)
ch2 <- struct{}{}
}
wg.Done()
}()
go func() {
for _, value := range []int{2, 4, 6} {
<- ch2
fmt.Println(value)
ch1 <- struct{}{}
}
wg.Done()
}()
wg.Wait()
}
如果您需要这样的排序,您可能会重新评估是否需要使用 goroutine。但是,您描述解决方案的方式是正确的:
go first() {
for {
<-ch1
// do stuff
ch2<-struct{}{}
}
}()
go second() {
for {
<-ch2
// do stuff
ch3<-struct{}{}
}
}()
go third() {
for {
<-ch3
// do stuff
ch1<-struct{}{}
}
}()
但是,这是一个循环设置,你必须在这个结构之外开始第一个:
go first() {...}()
go second() {...}()
go third() {...} ()
// Start the first one
ch1<-struct{}{}
我有三个 gorutine,它们应该在某种循环中工作。例如,我有
go first() {
// do some stuff
}
go second() {
// do another kind of stuff
}
go third() {
// do third kind of stuff
}
他们必须这样工作: 第一-第二-第三-第一-/依此类推/
我想我必须为此使用频道,但我想不出正确的方法。 如果我制作三个不同的频道 第一到第二, SeocndToThird, ThirdToFirst,然后当我 运行 一个程序时,我得到错误:
fatal error: all goroutines are asleep - deadlock!
但是如果我去掉 ThirdToFirst,我就有了一个合适的循环,然后 gorutine 开始随机工作。
我当然漏掉了什么,但是什么?
带有两个 gorutine 的示例代码
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
ch1 := make(chan struct{})
ch2 := make(chan struct{})
go func() {
for _, value := range []int{1, 3, 5} {
<- ch1
fmt.Println(value)
ch2 <- struct{}{}
}
wg.Done()
}()
go func() {
for _, value := range []int{2, 4, 6} {
<- ch2
fmt.Println(value)
ch1 <- struct{}{}
}
wg.Done()
}()
wg.Wait()
}
如果您需要这样的排序,您可能会重新评估是否需要使用 goroutine。但是,您描述解决方案的方式是正确的:
go first() {
for {
<-ch1
// do stuff
ch2<-struct{}{}
}
}()
go second() {
for {
<-ch2
// do stuff
ch3<-struct{}{}
}
}()
go third() {
for {
<-ch3
// do stuff
ch1<-struct{}{}
}
}()
但是,这是一个循环设置,你必须在这个结构之外开始第一个:
go first() {...}()
go second() {...}()
go third() {...} ()
// Start the first one
ch1<-struct{}{}