以特定频率并行发送电子邮件

时间:2012-09-24 09:13:08

标签: python multiprocessing

我正在尝试并行发送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)

代码效果很好,但过了一段时间后,它就会挂起。你能指出错误或提出更好的方法来实现这个目标吗?

1 个答案:

答案 0 :(得分:5)

“一段时间后”产生了多少个子进程?为了确保不使用数以万计的子进程向您的系统发送垃圾邮件,请在收集结果后明确close多处理池。此外,我没有在您的代码中看到任何控制发送电子邮件的实际frequency的逻辑。假设您emailLst中有1000个包含5封电子邮件的列表。你的循环将尽可能快地产生1000个多处理池,即5000个子进程。您需要实现一些时序/调度代码。在最简单的情况下,这将是循环中的time.sleep(1)

此外,多重启动并不适合此问题,因为发送邮件不受CPU限制。我猜你的情况甚至不会受到I / O限制。您可以考虑将threading视为将阻塞调用外包给线程而不是子进程。