我已经编写了一个守护程序来监视目录中的文件,并在任何文件发生更改时发送电子邮件。我使用bb-freeze将其编译为Windows .exe。让我们在运行了几天后注意到它在内存中占用的空间越来越大。Python smtplib模块泄漏内存
我用Heapy来监视.py文件中的内存使用情况(不是编译后的.exe),发现每次调用函数时,对象的数量都增加了3,相应的内存使用增加了484字节。它使用smtplib模块,我无法理解泄漏发生的位置。
from guppy import hpy
import time
import gc
import os
import smtplib
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.MIMEAudio import MIMEAudio
from email.MIMEImage import MIMEImage
from email.Encoders import encode_base64
def sendMail(subject, text, to='[email protected]', username='[email protected]', password='blah', smtpServer='smtp.gmail.com', smtpPort=587):
gmailUser = username
gmailPass = password
recipient = to
msg = MIMEMultipart()
msg['From'] = gmailUser
msg['To'] = recipient
msg['Subject'] = subject
msg.attach(MIMEText(text))
mailServer = smtplib.SMTP(smtpServer, smtpPort)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmailUser, gmailPass)
mailServer.sendmail(gmailUser, recipient, msg.as_string())
mailServer.quit()
print('Sent email to "%s"' % recipient)
if __name__=='__main__':
while True:
sendMail("Function", "Blah!")
gc.collect()
print hpy().heap()
time.sleep(10)
我刚刚在互联网上的某个地方看到了这段代码并复制了它。它可以工作,但会泄漏内存。 有人可以帮我找出内存泄漏发生的地方吗? :(
编辑:似乎使用msg.as_string()是什么导致内存泄漏。使用纯文本如msg =“Blah”代替msg.as_string()修复了这个问题。不允许我添加主题行
你应该在这里添加你的答案作为答案并接受它,而不是编辑你的帖子。或者,如果其中一个答案在这里最终准确地反映了答案,您应该接受它。 :) – sarnold 2011-03-24 04:55:08