微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何重叠 goroutines?

如何解决如何重叠 goroutines?

我有三个 gorutines,它们应该在某种循环中工作。例如,我有

go first() {
    // do some stuff
}
 
go second() {
    // do another kind of stuff
}

go third() {
    // do third kind of stuff
} 

他们必须这样工作: 第一 - 第二 - 第三 - 第 - /等等等等/

我想我必须为此使用频道,但我想不出正确的方法。 如果我制作三个不同的频道 FirstToSecond,第二到第三ThirdToFirst,然后当我运行程序时,出现错误

Fatal error: all goroutines are asleep - deadlock!

但是如果我摆脱了ThirdToFirst,我就有了一个适当的循环,然后 gorutines 开始随机工作。

我肯定遗漏了一些东西,但是什么?

带有两个 gorutines 的示例代码

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()
}

解决方法

如果你需要这样的排序,你可能会重新评估你是否需要使用 goroutines。但是,您描述解决方案的方式是正确的:

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{}{}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。