直接点说,就是由于fmt 是线程不安全的, 如果你在多协程场景下使用fmt打印信息可能会得到乱序的结果 就是说 不按代码里的顺序打印.

下面看示例

代码示例

golang fmt 多线程 乱序:

func main()  {
wg := sync.WaitGroup{}
wg.Add(10)
var arr []int for i:=0;i<10;i++ {
go func(i int) {
defer wg.Done()
arr = append(arr, i)
log.Printf("i: %d",i)
}(i)
}
wg.Wait() // 隔离
s :=0
for _, v := range arr{
fmt.Println(v)
s += v
}
log.Println(s) }

输出结果是这样的:

2019/09/16 20:54:22 i: 2
2
2019/09/16 20:54:22 i: 4
4
2019/09/16 20:54:22 i: 0
8
2019/09/16 20:54:22 i: 8
7
2019/09/16 20:54:22 i: 6
2019/09/16 20:54:22 40

虽然有wait 隔离了协程的执行,但 fmt 还是导致了乱序. 和普通的多线程问题还不太一样.

这个我和同事研究了一下,有可能 是因为log 有个输出的buffer,wait之前的逻辑 只能确保信息输出到buffer,之后log 和fmt 竞争std.out. 所以交叉输出.

最后

最后,打印信息的话 一般也不用fmt,fmt一般用来格式化. 所以没啥奇葩需求也就不要用fmt了.

最新文章

  1. 好文mark
  2. java程序链接到sql server数据库
  3. 学习Google Protocol buffer之语法
  4. Caliburn.Micro(CM) 穿过 Popup 绑定方法
  5. WinForm编程时窗体设计器中ComboBox控件大小的设置
  6. POJ1062 昂贵的聘礼(最短路)
  7. hdu4847 Wow! Such Doge!(简单题+坑爹的输入)
  8. android app安全问题设置
  9. Android开发学习之路--Service之初体验
  10. sort和priority_queue的比较函数总结
  11. linux 值安装yum包
  12. 根据ip获取地理信息
  13. cocos2dx创建win32项目一般步奏
  14. 遇到的eclipse启动报错问题解决
  15. SQL server学习(五)T-SQL编程之存储过程
  16. 【appium】根据UIAutomator定位元素
  17. windows server 2008 HPC Edtion激活教程
  18. mysql常见字符串处理函数
  19. 使用Nancy搭建简单的Http服务的示例demo
  20. 面试准备之一Python

热门文章

  1. AC自动机 数组实现
  2. HDU 3081 Marriage Match II 二分 + 网络流
  3. List集合的排序
  4. spring security jquery ajax重定向问题解决
  5. 做一个完整的Hadoop项目
  6. 个人IP「Android大强哥」上线啦!
  7. FreeSql (三十四)CodeFirst 迁移说明
  8. 在64位Linux上安装32位gmp大数库
  9. selenium IDE的断言与验证
  10. centos7上部署dubbo管理控制台dubbo-admin