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また、実際のメール送信を制御するロジックがコードに表示されません。に 5 通のメールのリストが 1000 個あるとしますemailLst。ループは 1000 個のマルチプロセッシング プール、つまり 5000 個のサブプロセスをできるだけ速く生成します。タイミング/スケジューリング コードを実装する必要があります。最も単純なケースでは、これはtime.sleep(1)ループ内にあります。

また、メールの送信は CPU バウンドではないため、マルチプロセッシングはこの問題にはあまり適していません。私が推測するあなたの場合、それはI/Oバウンドでさえありません。threadingサブプロセスではなくスレッドへのブロッキング呼び出しをアウトソーシングする目的で検討できます。

于 2012-09-24T09:26:34.287 に答える