2011-05-01 6 views
2

Mon script récupère le contenu d'une page rss obtient les URL de cette page les enregistre dans une liste puis il saisit le contenu de chaque URL et il envoie le contenu de la page par e-mail. Tout fonctionne très bien et je ne peux pas envoyer tous les liens de la liste. Typiquement environ 22 liens dans la liste. Je ne souhaite pas combiner le contenu de plusieurs liens dans un seul e-mail. Si je n'ajoute pas un délai d'attente je reçois une erreur sur quota comme celui-ciLe moteur de l'application Google python timeout envoi email

<class 'google.appengine.runtime.apiproxy_errors.OverQuotaError'>: The API call mail.Send() required more quota than is available. 

Après avoir ajouté « time.sleep (9) » pour le ralentir, il me donne cette erreur.

<class 'google.appengine.runtime.DeadlineExceededError'>: 
Traceback (most recent call last): 

Voici mon code .. Des pensées?

size = len(my_tabletest) 
a=2 
while a < size: 
    url = my_tabletest[a].split('html</link>')[0] + "print" 
    url_hhhhhh = urlfetch.fetch(url) 
    my_story = url_hhhhhh.content 
    my_story = my_story.split('<div class="printstory">')[1] 
    my_story_subject = my_story.split('<h1>')[1] 
    my_story_subject = my_story_subject.split('</h1>')[0] 
    my_story = ''.join(BeautifulSoup(my_story).findAll(text=True)) 
    message = mail.EmailMessage(sender="me<[email protected]>", 
    subject=my_story_subject) 
    message.to = "Jim <[email protected]>" 
    message.body = my_story 
    message.html = my_story_html 
    message.send() 
    time.sleep(9) 
    a=a+1 
+0

Vous atteignez probablement le [quota par minute] (http://code.google.com/appengine/docs/quotas.html#Per-minute_Quotas). Je suppose que l'API Tasks pourrait être une solution de contournement ici, mais je ne les ai jamais utilisés auparavant. D'un autre côté, pensez à utiliser [Feed Parser] (http://www.feedparser.org/) si vous faites beaucoup d'analyse manuelle de RSS. – hyperslug

Répondre

6

Bienvenue dans Stack Overflow! Le task queue est construit pour résoudre ce problème. Vous pouvez tirer parti avec un changement minimal à votre code existant en utilisant le deferred library:

Au lieu d'appeler message.send(), faire quelque chose comme ceci:

def send_email(message): 
    message.send() 

deferred.defer(send_email, message) 

Cela va créer un lot de tâches ad-hoc qui envoient vos e-mails en arrière-plan, après le retour de votre gestionnaire de requêtes principal. Certaines de ces tâches échoueront probablement au premier essai, car votre application atteint des limites de quota à court terme pour le courrier sortant. C'est bon; Les tâches échouées seront annulées et réessayer automatiquement jusqu'à ce qu'elles réussissent.

Modifier: Oh, et prenez le sleep de votre code. =)

Éditer # 2: Vous pouvez encore accélérer les choses en déplaçant l'urlfetch dans la tâche, de sorte que chaque tâche récupère une URL et envoie un e-mail. L'extraction de 22 URL dans un gestionnaire de requêtes peut suffire à provoquer des dépassements de délai, indépendamment de l'envoi de courrier.

+1

Vous pouvez également faire 'deferred.defer (message.send)'. –