我正在尝试并行发送5封电子邮件。函数 scheduleEmails 将5个电子邮件地址列表的列表作为输入。我的代码如下所示:
import multiprocessing
import smtplib
def sendMail(email):
#sends email using smtplib
# returns True in case of success, False in case of failure
def scheduleEmails(emailLst):
"""
emailLst is a list of list of 5 emails
emailLst = [[emailAddr1,emailAddr2,emailAddr3...emailAddr5],
[emailAddr6...emailAddr10],
[emailAddr11... emailAddr[15],...]
"""
FREQUENCY = 5 # no. of emails to be send per second
for i in range(len(emailLst)):
p = multiprocessing.Pool(FREQUENCY)
emails = emailLst[i]
results = p.map(sendEmail,emails)
scheduleEmails(someEmailLst)
代码效果很好,但过了一段时间后,它就会挂起。你能指出错误或提出更好的方法来实现这个目标吗?
答案 0 :(得分:5)
“一段时间后”产生了多少个子进程?为了确保不使用数以万计的子进程向您的系统发送垃圾邮件,请在收集结果后明确close多处理池。此外,我没有在您的代码中看到任何控制发送电子邮件的实际frequency
的逻辑。假设您emailLst
中有1000个包含5封电子邮件的列表。你的循环将尽可能快地产生1000个多处理池,即5000个子进程。您需要实现一些时序/调度代码。在最简单的情况下,这将是循环中的time.sleep(1)
。
此外,多重启动并不适合此问题,因为发送邮件不受CPU限制。我猜你的情况甚至不会受到I / O限制。您可以考虑将threading
视为将阻塞调用外包给线程而不是子进程。