我已經編寫了一個守護程序來監視目錄中的文件,並在任何文件發生更改時發送電子郵件。我使用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