Go for循环中的defer

news2024/11/24 6:05:54

背景

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

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 main

import (
	"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.coloradmin.cn/o/995290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

buuctf crypto 【RSAROLL】解题记录

1.打开文件&#xff0c;发现数据 2.rsa算法中的n&#xff0c;e&#xff0c;多个c都已经给出&#xff0c;写出脚本计算出每个c对应的m值转换成字符即可 3.运行得到flag

哈希切割 及 海量数据处理面试题讲解

文章目录 哈希切割及海量数据处理面试题讲解问题1问题2 哈希切割及海量数据处理面试题讲解 问题1 给两个文件&#xff0c;分别有100亿个query字符串&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f;分别给出精确算法和近似算法 近似算法&#xff1a…

PL2303串口不支持WINDOWS11解决方法

1.打开设置管理器--端口选择不支持的串口--右击--选择卸载驱动--刷新 即可使用 2.禁用驱动更新:保存下面为 "disable_win11_update_driver.reg", 双击加入注册表 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\W…

【商业知识】中国消费者洞察

文章目录 一、市场: 中国消费市场已进入复苏期二、政策: 政策不断优化消费环境三、社会: 消费者逐步步入正确消费时代四、品牌: 科普专业知识&#xff0c;加深消费者对技术力的感知五、电商直播: 提供源头优质产品&#xff0c;提高生活质量六、信息平台: 科学消费和内容营销&am…

【Java Web】Kafka,构建TB级异步消息系统

1. 阻塞队列 BlockingQueue 解决线程通信的问题&#xff1b;阻塞方法&#xff1a;put从队列中存一个 &#xff0c; take 从队列中拿出一个 生产者消费者模式 生产者&#xff1a;产生数据的线程&#xff1b;消费者&#xff1a;使用数据的线程。 实现类 ArrayBlockingQueueLinke…

pyqt5调用摄像头

pyqt5调用摄像头 1、UI布局 2、代码 # !/usr/bin/python # -*- coding: utf-8 -*-""" contact: 微信 1257309054 file: t.py time: 2023/9/10 0:16 author: LDC """import sysimport cv2 from PyQt5 import QtCore from PyQt5 import QtWidget…

buuctf crypto 【RSA】解题记录

1.打开文件后&#xff0c;可以看到公钥&#xff0c;打开后解析公钥 2.分解一下n&#xff0c;得到p&#xff0c;q&#xff08;使用yafu分解&#xff09;后&#xff0c;写出脚本 3.运行&#xff0c;得到flag

Emscripten安装并配置环境变量

前言 Emscripten官网 官网有安装教程&#xff0c;但有些细节没有讲清楚&#xff0c;本文会很详细的讲解每一步。 一、下载 emsdk 包 emsdk – github地址 可以使用 git 去拉取&#xff0c;不过可能会超时拉取失败。 git clone https://github.com/emscripten-core/emsdk.…

电子信息工程专业课复习知识点总结:(一)电路分析基础

文章目录 第一章&#xff1a;电路的基本概念和电路定律第二章&#xff1a;电阻电路的等效变换第三章&#xff1a;电阻电路的一般分析方法第四章&#xff1a;电路定理1.叠加定理2.替代定理3.戴维南定律4.诺顿定律5.最大功率传输定理6.特勒根定理7.互易定理8.对偶定理 第七章 储能…

常用调优命令及各种 OOM 的应对策略【JVM调优】

文章目录 1. 常见的调优命令2. 常见的性能调优3. 常用的调优工具4. 各种 OOM 的应对策略5. 配置垃圾收集器6. CPU 占用过高 1. 常见的调优命令 ① jps&#xff1a;显示所有虚拟机进程&#xff1b; ② jstack&#xff1a;生成当前线程快照&#xff1b; ③ jmap&#xff1a;生成…

基于SSM的在线云音乐系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Linux内核分析与应用3-进程管理

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好&#xff0c;推荐观看 留此记录&#xff0c;蜻蜓点水,可作抛砖引玉 3.1 进程概述 一个程序通过编译器将其编译成汇编程序,经过汇编器将其汇编成目标代码,通过链接器形成可执行文件a.out或者elf格式,…

Kali2022.3虚拟机编译AOSP(从Kali安装到完成Aosp编译详细记录)

一.前言 测试的硬件环境(轻薄本)&#xff1a;cpu&#xff1a;Amd r5 4600u,内存&#xff1a;16g&#xff0c;外接固态硬盘盒子。测试(下载和编译Android10)结果&#xff1a;下载时长为0.5-1h&#xff0c;编译时长接近5h&#xff1b;虚拟机环境&#xff1a;VMware Workstation …

Stream流用法详解

文章目录 &#x1f412;个人主页&#x1f3c5;JavaSE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;什么是Stream流&#xff1f;&#x1f9f8;流的概念 &#x1f415;如何获取流&#x1f415;流的操作&#x1f3c5;中间操作&#xff08;返回类型都是流&#xff09;filter…

【strcat函数和strncat函数的对比与模拟实现】

strcat函数和strncat函数的对比与模拟实现 1.strcat函数的介绍 资源来源于cplusplus网站 它的作用是&#xff1a; 将源字符串的副本追加到目标字符串。目标中的结束空字符被源的第一个字符覆盖&#xff0c;并且在由目标中的两个字符串串联形成的新字符串的末尾包含一个空字符…

数据结构之单链表(c++(c语言)通用版)

我们创建一个长度为n的链表时&#xff0c;可以采取头插法创建或者尾插法创建&#xff0c;本篇博客我们采取头插法来创建&#xff0c;&#xff08;作者只学了头插&#xff0c;尾插等以后来补qwq&#xff0c;补上喽)。 头插原理 我们先来画图来看看头插的创建形式把&#xff0c…

《python趣味工具》——酷炫二维码(2):批量定制合适的二维码

今天&#xff0c;我们将学习如何从Excel中提取相应的内容然后批量生成相应的二维码。 文章目录 一、Excel的基本操作&#xff1a;1. Excel的基本结构&#xff1a;2. 安装xlrd模块&#xff1a;3. 读取指定工作表&#xff1a;4. 读取指定内容&#xff1a;Tip:切片读取&#xff1a…

线性代数的学习和整理19,特征值,特征向量,以及引入的正交化矩阵概念(草稿)

目录 1 什么是特征值和特征向量&#xff1f; 1.1 特征值和特征向量这2个概念先放后 1.2 直观定义 1.3 严格定义 2 如何求特征值和特征向量 2.1 方法1&#xff1a;结合图形看&#xff0c;直观方法求 2.1.1 单位矩阵的特征值和特征向量 2.1.2 旋转矩阵 2.2 根据严格定义…

buuctf crypto 【RSA2】解题记录

1.打开文件 2.写脚本 3.16进制转字符串

Ardupilot — AP_OpticalFlow代码梳理

文章目录 前言 1 Copter.cpp 1.1 void Copter::setup() 2 system.cpp 2.1 void Copter::init_ardupilot() 3 sensors.cpp 3.1 void Copter::init_optflow() 3.2 对象optflow说明 4 OpticalFlow.cpp 4.1 void OpticalFlow::init(uint32_t log_bit) 5 AP_OpticalFlow_…