Golang函数被调用后却未开始执行的问题
Golang函数被调用后却未开始执行的问题 我有如下代码
func outerFunc (wg *sync.WaitGroup,arr []inteface){
defer wg.done
for i, data := range arr {
innerfunc(data)
}
}
func innerfunc (data inteface){
// do processing to data
debug.PrintStack()
}
func main(){
var wg sync.WaitGroup
data:= "some data"
for {
<-time.After(10* time.Second)
wg.Add(1)
outerFunc(&wg,data)
}
}
outerFunc 调用了 innerFunc 并在第一次迭代中打印并完成了其所有执行。但是,当我在第二次迭代中调用 outerFunc 时,它会在 innerFunc(data) 处卡住,并且 innerfunc 的 printstack 没有被调用,这意味着 innerfunc 从未执行,程序在这一点上卡住了,没有抛出任何异常和警告。我是不是做错了什么?
注意: 此函数在 Docker 容器中运行。
更多关于Golang函数被调用后却未开始执行的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
你能在 Playground 上准备一个版本吗?因为这个版本包含了一些拼写错误,我不确定这些错误是原本就存在并且是问题的一部分,还是只是在将代码复制到论坛时引入的。
更多关于Golang函数被调用后却未开始执行的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
https://play.golang.org/p/diIS6j46kCV 这是该函数的示例,但在实际的函数中,虽然结构相同,但包含了一些复杂性。
问题出在 outerFunc 的第二个参数类型声明错误,以及 wg.Done() 的调用方式不正确。以下是修正后的代码:
func outerFunc(wg *sync.WaitGroup, arr []interface{}) {
defer wg.Done() // 修正:需要括号调用
for _, data := range arr {
innerFunc(data)
}
}
func innerFunc(data interface{}) {
// do processing to data
debug.PrintStack()
}
func main() {
var wg sync.WaitGroup
data := []interface{}{"some data"} // 修正:需要切片类型
for {
<-time.After(10 * time.Second)
wg.Add(1)
go outerFunc(&wg, data) // 建议:添加go关键字并发执行
}
}
主要问题:
wg.Done应该是wg.Done()- 需要括号调用方法arr []inteface应该是arr []interface{}- 类型声明错误data变量应该是切片类型[]interface{}{"some data"}
如果问题仍然存在,建议添加超时控制:
func outerFunc(wg *sync.WaitGroup, arr []interface{}) {
defer wg.Done()
done := make(chan bool, 1)
go func() {
for _, data := range arr {
innerFunc(data)
}
done <- true
}()
select {
case <-done:
return
case <-time.After(5 * time.Second):
log.Println("outerFunc timeout")
}
}
在Docker容器中运行时,还需要检查:
- 内存和CPU限制是否足够
- 是否有死锁或goroutine泄漏
- 使用pprof进行性能分析:
import _ "net/http/pprof"
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// ... rest of main
}

