当前位置: 首页 > news >正文

Go for循环中的defer

背景

写个后台程序,定时抓取服务器指标,代码逻辑如下,使用一段时间后内存不断增加

func CollectInfo() {for {// 获取服务器信息代码// ...............resp, err := http.Post("http://server", "application/json", strings.NewReader(`{"info1": "xxxx", "info2": "yyyy"}`))if err != nil {// 错误处理}defer resp.Body.Close()// 处理其他逻辑time.Sleep(time.Minute)}
}

排查

一开始感觉是哪里文件或者网络忘记Close了,看下进程打开的文件.
如下图类似情况, 看到很多http ESTABLISHED状态,估计就是哪个http忘记Close.
排查代码,问题应该出现在上面一段代码,for循环中defer不会执行,在函数返回时执行

# 查看进程打开的文件
lsof -p `pgrep defer`

在这里插入图片描述

验证

写个例子测试一下

package mainimport ("log""time"
)func main() {log.Println("program started")for i := 0; i < 3; i++ {defer func(i int) {log.Println("defer executed: ", i)}(i)}time.Sleep(time.Minute)log.Println("program exited")
}

根据打印的时间,可以得出以下两条结论

  • defer只在函数返回时才执行
  • defer执行顺序是先进后出,先调用的后执行

在这里插入图片描述

优化

写defer写习惯了,这里不能用defer, 用完直接调用关闭

func CollectInfo() {for {// 获取服务器信息代码// ...............resp, err := http.Post("http://server", "application/json", strings.NewReader(`{"info1": "xxxx", "info2": "yyyy"}`))if err != nil {// 错误处理} else{resp.Body.Close()}// 处理其他逻辑time.Sleep(time.Minute)}
}
http://www.lryc.cn/news/163413.html

相关文章:

  • 创建开机自启的脚本
  • 学生信息系统(python实现)
  • 管理类联考——数学——汇总篇——知识点突破——数据分析——1. 计数原理——排列组合——公式
  • C#,《小白学程序》第十六课:随机数(Random)第三,正态分布的随机数的计算方法与代码
  • 一文读懂java变量类型
  • 解决windows下git操作提示用户名密码错误的问题
  • ESP32开发:Clion配置IDF
  • 伦敦金的走势高低的规律
  • 【C#-1】C#调用matlab生成的dll库
  • MATLAB中pdist和pdist2的区别
  • 直播平台源码开发搭建APP的DASH协议:流媒体技术其中一环
  • 【前端】js解码base64
  • Apipost:API开发者的协同工作神器
  • 照片动起来软件有哪些?试试这几个
  • 【LeetCode】146.LRU缓存
  • 2021-2023顶会190+篇ViT高分论文总结(通用ViT、高效ViT、训练transformer、卷积transformer等)
  • 堆相关例子-最大线段重合问题
  • Ztree的日常使用记录
  • PYTHON 3.10中文版官方文档
  • TLS协议深度解析:挖掘现代网络安全防御的底层技术
  • python的time各种用法
  • Vue中使用vue-router
  • uni-app之android原生插件开发
  • javaee spring aop实现事务 项目结构
  • 9.9校招 实习 内推 面经
  • 互联网医院App开发:构建医疗服务的技术指南
  • 阅读分享--重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
  • 使用Python操作CSV文件,方便又快捷
  • 深入探索KVM虚拟化技术:全面掌握虚拟机的创建与管理
  • javaee springMVC model的使用