У меня есть код для работы с GAE, но я борюсь с ошибкой 500, которая выглядит из-за долгого ожидания (запуска).gae долгое время для вычисления mapreduce 500 error python
Я делаю следующее:
- Читать данного пользователя информация
- Выполнить некоторый метод MapReduce вычислить некоторые статистические данные и отправить это как электронная почта
- (Re) направить пользователя благодарить вас страницы, так как результаты будут отправлены по электронной почте
Код отлично работает на SDK SD Engine, так как нет ограничения по времени. Тем не менее, я продолжаю получать ошибку 500 при запуске кода в GAE. Если я не выполняю вычисления на шаге 2, тогда код снова работает (перенаправляется на новую страницу и отправляет электронную почту). Я попытался сделать шаг 2 после шага 3, но продолжаю получать ту же ошибку.
Есть ли простой способ исправить это? Я думаю о чем-то вроде получения информации о пользователе и сообщить им, что результаты будут отправлены по электронной почте или перенаправлены на главную страницу. Тем временем (или после вышесказанного) я могу запустить mapreduce в бэкэнд и отправить заполненные результаты, чтобы срок не прерывал мой код.
class Guestbook(webapp2.RequestHandler):
def post(self):
#get info provided in form by user (code not shown here)
# send them to new page or main page
self.response.write('<html><body>You wrote:<pre>')
self.response.write("thanks")
self.response.write('</pre></body></html>')
#self.redirect('/')
dump_content = 'Error'
try:
dump_content = long_time_taking_mapreduce_method(user_given_info)
except DeadlineExceededError:
logging.warning("Deadline error")
send_results_as_email(OUTPFILE, dump_content)
app = webapp2.WSGIApplication([
('/', MainPage),
('/sign', Guestbook),
], debug=True)
вы в основном ответили на вопрос самостоятельно. Посмотрите на очередь задач (https://cloud.google.com/appengine/docs/python/taskqueue/), которая дает вам 10-минутный срок, а не 60 секунд в передней части. Если 10 минут недостаточно, вы можете запросить, сколько времени у вас осталось, сохраните контекст, когда вы приближаетесь к крайнему сроку, и перезапустите задачу с того места, где вы остановились. – konqi
Спасибо за информацию, но я немного смущен. Вы имеете в виду запустить метод mapreduce в taskqueue или просто добавить перенаправление в taksqueue? Не могли бы вы поставить небольшой код выше, чтобы я получил лучшую идею. Доктору taskqueue кажется, что я могу использовать только URL-адреса. –
введите 'long_time_taking_mapreduce_method (user_given_info)' вызов в другой RequestHandler. Поскольку этот обработчик запроса будет иметь URL-адрес, вы можете поставить очередь этого URL-адреса в очередь задач. – konqi