我正在运行一个 GO (1.9.2) 程序,我的代码类似于:
startTime := time.Now()
...
...
fmt.Printf("%v (1) %v \n", user.uid, int64(time.Since(startTime)))
fmt.Printf("%v (F) %v \n", user.uid, int64(time.Since(startTime)))
(两个 fmt 语句在连续的行上)
我预计打印输出的时间会相似,但这里有一些打印结果:
921 (1) 2000100
921 (F) 3040173800
(3 秒)
360 (1) 2000100
360 (F) 1063060800
(1秒)
447 (1) 4000200
447 (F) 2564146700
(2.5 秒)
两次打印输出之间的时间差始终很高。
这种现象的解释是什么?
额外信息:根据 pprof 的说法,在打印时大约有 15000 个 goroutine 在运行,但其中大多数都在等待套接字上的传入数据。
我运行了代码,GODEBUG=gctrace=1
但没有多少 GC 打印输出,几乎没有我的代码打印输出的数量那么多。
编辑: 似乎将 time.Since() 的结果存储到@Verran 建议的变量中解决了这个问题。
更改为fmt
没有log
帮助,但打印不再同步。
看来“问题”是在fmt
高负载环境中处理的方式。我希望有人能对这里发生的事情有所了解。