英文:
Calling non-goroutine function with goroutines
问题
我有一部分脚本,格式如下:
func main() {
for i=0;i<1000000;i++ {
go test()
}
}
func test() {
a := test2()
}
func test2()(var int) {
//一堆操作
return var
}
我运行了很多次迭代,一直都没问题。我想知道是否有可能两个或更多的goroutine同时调用函数"test2()"并导致崩溃?下面的格式是否比之前的更好?
func main() {
for i=0;i<1000000;i++ {
go test()
}
}
func test() {
test2 := func()(var int){
//一堆操作
return var
}
a := test2()
}
非常感谢!
英文:
I have part of a script with the following format:
func main() {
for i=0;i<1000000;i++ {
go test()
}
}
func test() {
a := test2()
}
func test2()(var int) {
//a bunch of operations
return var
}
I run a lot of iterations and it always work. I'm wondering is there any chance that two or more goroutines calling function "test2()" at the same time and cause a crash? Is the following format anyway better then the previous one?
func main() {
for i=0;i<1000000;i++ {
go test()
}
}
func test() {
test2 := func()(var int){
//a bunch of operations
return var
}
a := test2()
}
Thank you very much!
答案1
得分: 2
不,除非你的代码有问题(例如除以零)或者你明确调用了panic(),否则你的函数不会崩溃。如果它不访问任何字段(或者方法的文档没有指明可以并发调用),那么你的函数是线程安全的。
编辑:第一个代码更好。虽然两者的性能应该非常相似,因为它们运行相同的代码,但第一个代码更容易阅读。在第二个代码块中,你定义了多个函数,可能会有一点性能损失,但这可能会被编译器优化掉。
英文:
No, your function will not crash, unless there is something wrong in your code (i.e. division by zero) or you explicitly call panic(). If it doesn't access any fields (or methods whose documentation doesn't specify they may be called concurrently), then your function is thread-safe.
EDIT: The first code is better. Although both should have very similar performance, since they are running the same code, the first is easier to read. There may be a small performance penalty in your second code block, since you are defining a function multiple times, but that is probably optimized away by the compiler.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论