You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go应用函数未并发运行问题排查求助

问题分析与解决

你的代码并发结构本身没有错误,已经正确使用sync.WaitGroup,并且通过函数参数传递循环变量ticker,避免了goroutine捕获循环变量的常见问题。

输出看起来是同步执行的原因可能有以下几点:

  • GetOHLCV/RSI执行速度过快:如果这两个函数耗时极短,goroutine会在极短时间内依次完成,输出会看起来像是顺序执行,但实际是并发的。可以在每个goroutine里加入短暂延迟(比如time.Sleep(100*time.Millisecond)),或者观察输出的符号顺序是否偶尔变化,来验证并发是否真的生效。
  • 标准输出的序列化特性:fmt.Printf的标准输出是带锁的,多个goroutine同时调用时,输出会被自动序列化,避免输出内容混乱。这会导致即使goroutine并发执行,输出的内容也是按顺序显示的。可以改用log.Printf(默认会添加时间戳),或者在输出中加入当前时间,通过时间戳来判断goroutine是否是并发执行的。
  • tickers数量过少:如果GetTickers("USDT")返回的切片长度只有1,那自然只会启动一个goroutine,看起来就是同步执行的。可以检查fmt.Printf("ticker count: %v", len(tickers))的输出,确认tickers的数量是否符合预期。

验证并发的小修改示例:

go func(ticker *binance.BookTicker) {
    defer wg.Done()
    start := time.Now()
    ohlcv, _ := GetOHLCV(ticker.Symbol, "4h")
    rsi := RSI(ohlcv)
    fmt.Printf("RSI %v : %v | 耗时: %v\n", ticker.Symbol, rsi, time.Since(start))
}(ticker)

通过查看每个输出的耗时和顺序,就能判断是否是真正的并发。

内容的提问来源于stack exchange,提问作者BitQueen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:27:34