4

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

该代码运行良好,但一段时间后,它挂起。您能否指出错误或提出更好的方法来实现这一目标?

4

1 回答 1

6

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

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

于 2012-09-24T09:26:34.287 回答