0

У меня есть код для работы с GAE, но я борюсь с ошибкой 500, которая выглядит из-за долгого ожидания (запуска).gae долгое время для вычисления mapreduce 500 error python

Я делаю следующее:

  1. Читать данного пользователя информация
  2. Выполнить некоторый метод MapReduce вычислить некоторые статистические данные и отправить это как электронная почта
  3. (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) 
+0

вы в основном ответили на вопрос самостоятельно. Посмотрите на очередь задач (https://cloud.google.com/appengine/docs/python/taskqueue/), которая дает вам 10-минутный срок, а не 60 секунд в передней части. Если 10 минут недостаточно, вы можете запросить, сколько времени у вас осталось, сохраните контекст, когда вы приближаетесь к крайнему сроку, и перезапустите задачу с того места, где вы остановились. – konqi

+0

Спасибо за информацию, но я немного смущен. Вы имеете в виду запустить метод mapreduce в taskqueue или просто добавить перенаправление в taksqueue? Не могли бы вы поставить небольшой код выше, чтобы я получил лучшую идею. Доктору taskqueue кажется, что я могу использовать только URL-адреса. –

+0

введите 'long_time_taking_mapreduce_method (user_given_info)' вызов в другой RequestHandler. Поскольку этот обработчик запроса будет иметь URL-адрес, вы можете поставить очередь этого URL-адреса в очередь задач. – konqi

ответ

0

Весь смысл mapreduce заключается в том, что он работает автономно, принимая как можно больше задач и столько, сколько необходимо. Это побеждает целую цель, чтобы попытаться запустить ее внутри вашей функции обработчика.

Вместо этого ваша задача создания карты должна вызвать метод send_results_as_email, как только он получит результат.

+0

Любые предложения о том, как я могу назвать mapreduce вне функции обработчика (который получает параметры пользователя), очень ценятся. На данный момент мы можем игнорировать отправленное письмо, так как оно вызывается в конце методом mapreduce. Благодарю. –

+0

Причина, по которой я пытался это сделать, в первую очередь, соответствовал учебнику http://sookocheff.com/post/appengine/mapreduce/programmatic-mapreduce/ –

Смежные вопросы