2012-09-24 5 views
3

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

'잠시 후'몇개의 서브 프로세스가 생성 되었습니까? 수많은 하위 프로세스로 시스템을 스팸하지 않도록하려면 결과를 수집 한 후 명시 적으로 close 다중 처리 풀을 사용하십시오. 또한 실제 이메일을 보내려는 frequency을 제어하는 ​​코드가 없습니다. emailLst에 5 개의 이메일 목록 1000 개가 있다고 가정 해 보겠습니다. 루프는 가능한 한 빨리 1000 개의 다중 프로세스 풀, 즉 5000 개의 하위 프로세스를 생성합니다. 타이밍/스케줄링 코드를 구현해야합니다. 가장 단순한 경우 루프에서 time.sleep(1)이됩니다.

또한 메일 보내기가 CPU 바인딩이 아니기 때문에 다중 처리가이 문제에 적절하지 않습니다. 그것은 당신의 경우에 I/O 경계가 아니라고 생각합니다. 서브 프로세스 대신 스레드에 대한 블로킹 호출을 아웃소싱하기 위해 threading을 고려할 수 있습니다.

+0

감사합니다 1 월 스레딩이 더 나은 해결책입니다. – chochim