Тайм-аут 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-адресов в одном обработчике запросов может быть достаточно, чтобы вызвать таймауты, независимо от отправки почты.