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) 处卡住,并且 innerfuncprintstack 没有被调用,这意味着 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关键字并发执行
    }
}

主要问题:

  1. wg.Done 应该是 wg.Done() - 需要括号调用方法
  2. arr []inteface 应该是 arr []interface{} - 类型声明错误
  3. 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容器中运行时,还需要检查:

  1. 内存和CPU限制是否足够
  2. 是否有死锁或goroutine泄漏
  3. 使用pprof进行性能分析:
import _ "net/http/pprof"

func main() {
    go func() {
        log.Println(http.ListenAndServe("localhost:6060", nil))
    }()
    // ... rest of main
}
回到顶部