我编写了一个守护进程来监视目录中的文件,并在任何文件发生更改时发送电子邮件。我使用 bb-freeze 将其编译为 Windows .exe。让它运行几天后,我注意到它占用了越来越多的内存空间。
我使用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='blah@gmail.com', username='more.blah@gmail.com', 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() 可以解决此问题。但这不允许我添加主题行。