问题遇到的现象和发生背景
我有一个数据采集,自动采集Modbus tcp还有UDP的数据
用python做的,在cent os 7下运行
数据会分成两半,分别存在两个list里,两个线程分别连接两个服务端,将数据上传,上传之后就将list清空
用的是生产者消费者模型,采集好几个线程就往两个list里存,两个线程死循环从list里拿数据上传
用代码块功能插入代码,请勿粘贴截图
def UpdateTcpLocalThread(): #线程函数
while True:
try:
UpdateTcpLocal(plcBoolListLocal,1)
UpdateTcpLocal(plcFloatListLocal,0)
UpdateTcpLocal(navListLocal,2) #三个全局list里面存的是数据
time.sleep(refreshTime*2) #refreshTime是采样周期,上传周期是采样周期*2
except:
pass
def UpdateTcpLocal(dataList, typeNum):
with threadLock: #线程锁
NewList=dataList.copy() #先把数据转移出来,这样在上传过程中不影响生产者线程继续往里面堆数据
dataList.clear()
for data in NewList:
ds.pushData(data[0],data[1],data[2],data[3],typeNum) #需要把list里的数据堆进byte数组
ds.sendData(typeNum) #通过socket发送byte数组
ds.clearData(typeNum) #不管发送成功失败都清空byte数组
运行结果及报错内容
正式环境中连续跑了几个月都没有问题
后来又搭建了一个测试环境,一模一样的代码,只是本地库没有配,随手写了个255.255.255.1,保证它不会连通
结果几天就崩了,发现有内存泄漏,内存大概每2小时上涨2%,不会回落
今天把本地库的IP也指向唯一存在的服务端端口,内存泄漏的现象就没了,但是这样一来数据库里会有2份同样的数据
我的解答思路和尝试过的方法
仔细检查了一旦连接不上就不会清空list的可能性,没有啊,主要代码都在采集,一共也没几句上传的代码,感觉不应该出问题呀
也测试了如果socket连接不上,不停创建新的socket是否会不释放,没有呀,建个测试工程死循环不停建立socket,建立了几百万个,都自动回收了呀
上传的地方都加了try,线程应该不会崩,不管上传成功不成功list都清空
我想要达到的结果
什么情况?