根据Go中的依赖项执行任务

时间:2014-07-11 05:50:19

标签: go logic

我认为这更像是一个关于逻辑的问题,而不是自己。 我想找到一种基于go语言依赖性来执行任务的方法。

Task Workflow

考虑上述工作流程: 任务1,2,3和4可以同时异步运行。 当任务1和2完成时,将执行任务10。 任务3和4完成后将执行任务11 当任务11和12完成时,将执行任务12 当任务10和11完成时,将执行任务100。

我正在使用go渠道进行并发执行,并希望找到一种有效的方法来控制依赖项。我知道我可以有一些标志和一个表来控制执行,但理想情况下我想在内存中这样做以避免数据库调用来控制这样的事情。 我也明白,有几种方法可以做到这一点,但我想听听你的想法,因为我确信有一种更好的方式,而不是迄今为止我想出的方法。

1 个答案:

答案 0 :(得分:5)

在该主题上有一个有趣的reddit thread,以回应文章" How to Wait for All Goroutines to Finish Executing Before Continuing"。

正确的文章是" How to Wait for All Goroutines to Finish Executing Before Continuing, Part Two: Fixing My Oops"并说明了在继续执行其他任务之前等待goroutine的几种方法。

根据您要同步的任务的信息类型,sync.WaitGroup是一个很好的候选人(in this example)。

可是:

  

当您知道所期望的消息数量时,您可能会指望他们知道何时完成。在这里,WaitGroup是多余的,令人困惑。

这将阻止直到收到所有3条消息:

func main() {
  messages := make(chan int)
  go func() {
      time.Sleep(time.Second * 3)
      messages <- 1
  }()
  go func() {
      time.Sleep(time.Second * 2)
      messages <- 2
  }()
  go func() {
      time.Sleep(time.Second * 1)
      messages <- 3
  }()
  for i := 0; i < 3; i++ {
      fmt.Println(<-messages)
  }
}

所以这真的取决于你对等待任务的了解。