我觉得我的问题的答案是肯定的,但要求确定,因为我只是开始玩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当其他开发项目开始重新使用该方法时,何时在并发上下文中调用它们的方法.还有其他原因吗?
没有任何标准可以对这个问题说是或否.
虽然你可以通过这种方式正确地完成它,但是坚持简单的顺序执行要简单得多.
有三个原因浮现在脑海中:
result, err := invoke; if err != nil ....而不是通过通道传递结果和错误,错误处理就会简单得多invoke将来需要异步调用方法,那么将来更改代码.在您的函数周围添加异步包装器也同样容易.