步骤顺序时使用goroutine

n00*_*00b 0 go goroutine

我觉得我的问题的答案是肯定的,但要求确定,因为我只是开始玩Go几天.我们是否应该将IO绑定任务(如http请求)封装到goroutine中,即使它是在顺序用例中使用的?

这是我天真的例子.假设我有一个方法可以生成3个http请求但需要按顺序执行.将invoke方法创建为goroutines 有什么好处吗?我理解下面的例子实际上会受到性能影响.

func myMethod() {
   chan1 := make(chan int)
   chan2 := make(chan int)
   chan3 := make(chan int)

   go invoke1(chan1)

   res1 := <-chan1
   invoke2(res1, chan2)

   res2 := <-chan2
   invoke3(res2, chan3)

   // Do something with <-chan3
}
Run Code Online (Sandbox Code Playgroud)

我想到的一个可能的原因是,未来证明了invoke当其他开发项目开始重新使用该方法时,何时在并发上下文中调用它们的方法.还有其他原因吗?

Mar*_*arc 6

没有任何标准可以对这个问题说是或否.

虽然你可以通过这种方式正确地完成它,但是坚持简单的顺序执行要简单得多.

有三个原因浮现在脑海中:

  • 这仍然是顺序的:你正在等待每一个goroutine顺序,所以这没有给你买.如果只执行http请求,性能可能不会有太大变化,两种情况都会花费大部分时间等待响应.
  • 如果你只是得到result, err := invoke; if err != nil ....而不是通过通道传递结果和错误,错误处理就会简单得多
  • 过度概括比"未来证明"更容易理解.如果您invoke将来需要异步调用方法,那么将来更改代码.在您的函数周围添加异步包装器也同样容易.