【发布时间】:2016-03-10 14:18:48
【问题描述】:
我得到了一个在 GAE 上工作的代码,但我正在为 500 错误而苦苦挣扎,这似乎是由于漫长的等待(运行)时间。
我正在做以下事情:
- 读取用户给定的信息
- 运行一些 mapreduce 方法来计算一些统计数据并将其作为电子邮件发送
- (重新)将用户引导至感谢页面,因为结果将通过电子邮件发送
代码在 App engine SDK 上运行良好,因为没有时间限制。但是,当我在 GAE 上运行代码时,我不断收到 500 错误。如果我没有在第 2 步中执行计算,那么代码会再次起作用(重定向到新页面并发送电子邮件)。我尝试在第 3 步之后执行第 2 步,但仍然出现相同的错误。
有什么简单的方法可以解决这个问题吗?我正在考虑获取用户信息并让他们知道结果将通过电子邮件发送给他们或将他们重定向到主页。同时(或在上述之后)我可以在后端运行 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)
【问题讨论】:
-
您基本上已经自己回答了这个问题。看看任务队列 (cloud.google.com/appengine/docs/python/taskqueue),它给你 10 分钟的最后期限,而不是前端的 60 秒。如果 10 分钟还不够,您可以请求您还有多少时间,在接近截止日期时保存上下文,然后从中断处重新开始任务。
-
感谢您的信息,但我有点困惑。您的意思是在任务队列中运行 mapreduce 方法还是只是将重定向添加到任务队列?您能否在上面放一些小代码,以便我有一个更好的主意。任务队列文档使我似乎只能在其中运行 url。
-
将
long_time_taking_mapreduce_method(user_given_info)调用放入另一个RequestHandler。由于该请求处理程序将有一个 url,因此您可以将该 url 排队到任务队列中。
标签: python-2.7 google-app-engine mapreduce google-app-engine-python