我正在研究并发的Go库,偶然发现了goroutine之间两种相似的同步模式,其结果相似:
使用等待组
var wg sync.WaitGroup
func main() {
words := []string{ "foo", "bar", "baz" }
for _, word := range words {
wg.Add(1)
go func(word string) {
time.Sleep(1 * time.Second)
defer wg.Done()
fmt.Println(word)
}(word)
}
// do concurrent things here
// blocks/waits for waitgroup
wg.Wait()
}
使用频道
func main() {
words = []string{ "foo", "bar", "baz" }
done := make(chan bool)
defer close(done)
for _, word := range words {
go func(word string) {
time.Sleep(1 * time.Second)
fmt.Println(word)
done <- true
}(word)
}
// Do concurrent things here
// This blocks and waits for signal from channel
<-done
}
有人告诉我,sync.WaitGroup
它的性能要好一些,而且我已经看到它被普遍使用。但是,我发现频道更惯用了。sync.WaitGroup
通过渠道使用的真正优势是什么?和/或更好的情况又可能是什么情况?
独立于第二个示例的正确性(如注释中所述,您没有按照自己的想法进行操作,但是很容易修复),我倾向于认为第一个示例更容易掌握。
现在,我什至不会说渠道更加惯用。通道是Go语言的一种签名功能,并不意味着在任何可能的情况下使用它们都是惯用的。Go的惯用用法是使用最简单,最容易理解的解决方案:在这里,WaitGroup
传达含义(您的主要职能是Wait
完成工作)和机制(工作人员在工作时通知Done
)。
除非您的情况非常特殊,否则我不建议您在此使用渠道解决方案。
问题内容: 我下面有这个简单的程序 请注意,我使用的是值,而不是指针。但是sync包的页面指定,和函数采用。 为什么/如何运作? 问题答案: 的设定方法的是空的方法集: 输出(在Go Playground上尝试): 这是因为所有方法都具有指针接收器,因此它们都是该类型的方法集的一部分。 当您这样做时: 这实际上是的简写,等等。 这是在规范中:致电: 如果是可寻址且方法集包含,则为的简写。 因此,当
本文向大家介绍什么是smarty? Smarty的优点是什么?相关面试题,主要包含被问及什么是smarty? Smarty的优点是什么?时的应答技巧和注意事项,需要的朋友参考一下 Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。
问题内容: 只是想知道TreeSet的优缺点是什么,是否有人可以告诉我?谢谢! 问题答案: 收藏类之一。它使您可以按键或按键顺序访问集合中的元素。它比ArrayList或HashMap具有更多的开销。当您不需要顺序访问时,只需按键查找即可使用HashSet。使用ArrayList并使用Arrays。如果只想按顺序排列元素,则排序。TreeSet始终保持元素顺序。使用ArrayList,您可以在需要
本文向大家介绍什么是pytest?其优点是什么?,包括了什么是pytest?其优点是什么?的使用技巧和注意事项,需要的朋友参考一下 Pytest是python中的测试框架。要安装pytest,我们需要使用命令pip install pytest。安装后,我们可以通过pytest –version命令验证是否已安装python 。pytest的版本应该是已知的。 Pytest可用于创建和执行测试用例
本文向大家介绍什么是 Netflix Feign?它的优点是什么?相关面试题,主要包含被问及什么是 Netflix Feign?它的优点是什么?时的应答技巧和注意事项,需要的朋友参考一下 Feign 是受到 Retrofit,JAXRS-2.0 和 WebSocket 启发的 java 客户端联编程序。Feign 的第一个目标是将约束分母的复杂性统一到 http apis,而不考虑其稳定性。在 e
问题内容: 我正在寻找提高某些SQL性能的方法,当前CTE正在脚本中多次使用和引用。我会使用表变量来获得改进吗?(因为代码在函数内,所以不能使用临时表)。 问题答案: 您实际上必须进行性能测试-没有“是/否”答案。根据安迪·利文(Andy Living)上面链接到的文章,CTE只是查询或子查询的简写。 如果您在同一函数中两次或多次调用它,则填充表变量然后加入该表变量或从中选择表变量可能会获得更好的