Тайм-аут Python ядра Google для отправки электронной почты - PullRequest
2 голосов
/ 01 мая 2011

Мой скрипт получает содержимое страницы rss, получает URL-адреса на этой странице, сохраняет их в списке, затем захватывает содержимое каждого URL и отправляет мне содержимое страницы по электронной почте. Все работает очень хорошо, примите, я не могу отправить каждую ссылку в списке. Обычно около 22 ссылок в списке. Я не хочу объединять содержимое нескольких ссылок в одно письмо. Если я не добавляю тайм-аут, я получаю ошибку превышения квоты, как это

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

После того, как я добавил «time.sleep (9)», чтобы замедлить его, я получаю эту ошибку.

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

Вот мой код .. Есть мысли?

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<me@someplace.com>",
  subject=my_story_subject)
  message.to = "Jim <me@someplace.com>"
  message.body = my_story
  message.html = my_story_html
  message.send()
  time.sleep(9)
  a=a+1

1 Ответ

6 голосов
/ 01 мая 2011

Добро пожаловать в переполнение стека!

Очередь задач создана для решения этой проблемы. Вы можете использовать его с минимальными изменениями в существующем коде, используя отложенную библиотеку :

Вместо того, чтобы звонить message.send(), сделайте что-то вроде этого:

def send_email(message):  
  message.send()

deferred.defer(send_email, message)

Это создаст пакет специальных задач, которые отправят ваши электронные письма в фоновом режиме, после того как ваш основной обработчик запросов вернется. Некоторые из этих задач, вероятно, не будут выполнены с первой попытки, поскольку ваше приложение достигнет краткосрочных пределов квоты для исходящей почты. Это нормально; сбойные задачи будут откатываться и повторяться автоматически до тех пор, пока они не будут выполнены.

Редактировать: О, и возьмите sleep из своего кода. =) * * 1 018

Редактирование # 2: Вы можете ускорить процесс, переместив urlfetch в задачу, чтобы каждая задача извлекала один URL-адрес, а затем отправляла одно электронное письмо. Извлечение 22 URL-адресов в одном обработчике запросов может быть достаточным для истечения времени ожидания независимо от отправки почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...