Тайм-аут Python ядра Google для отправки электронной почты

Мой сценарий получает содержимое страницы 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 ответ

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

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

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

def send_email(message):  
  message.send()

deferred.defer(send_email, message)

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

Редактировать: Да, и взять sleep из вашего кода. знак равно

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

Другие вопросы по тегам