Python 请求应用程序引擎和EC2之间的超时
我的webapp有两个部分:Python 请求应用程序引擎和EC2之间的超时,python,google-app-engine,amazon-web-services,amazon-ec2,timeout,Python,Google App Engine,Amazon Web Services,Amazon Ec2,Timeout,我的webapp有两个部分: 一种GAE服务器,处理web请求并将其发送到ec2rest服务器 一个ec2rest服务器,它执行来自GAE的给定信息的所有计算并返回结果 当计算简单时,它工作良好。否则,我将在GAE端出现timeout错误 我意识到有一些方法可以解决这个超时问题。但是经过一些研究,我发现(如果我错了,请纠正我): taskqueue无法满足我的需要,因为有些计算可能需要半个多小时 “GAE后端实例”在我一直保留另一个实例时起作用。但由于我已经重新预订了一个EC2实例,我想找到一些
GAE
服务器,处理web请求并将其发送到ec2rest
服务器ec2rest
服务器,它执行来自GAE的给定信息的所有计算并返回结果timeout
错误
我意识到有一些方法可以解决这个超时问题。但是经过一些研究,我发现(如果我错了,请纠正我):
taskqueue
无法满足我的需要,因为有些计算可能需要半个多小时
“GAE后端实例”在我一直保留另一个实例时起作用。但由于我已经重新预订了一个EC2实例,我想找到一些“便宜”的解决方案(不同时支付GAE后端实例和EC2的费用)
“GAE Asynchronous Requests”也不是一个选项,因为它仍然等待来自EC2的响应,尽管用户可以在等待时发送其他请求
下面是我的代码的一个简单示例,它要求:
用户上传csv
解析此csv并将信息发送到EC2
从EC2生成给定响应的输出页面
OutputPage.py
这是发送信息的代码。到EC2
现在,我的问题是:
在GAE
端是否有方法允许我只将请求发送到EC2
,而不等待其响应?如果这是可能的,在EC2端,我可以向用户发送电子邮件,在结果准备好时通知他们
如果问题1不可能。有没有办法在EC2
上创建一个监视器,一旦从GAE
端收到信息,它就会调用计算
我感谢您的建议。以下是一些要点:
- 对于问题1:您不需要在GAE端等待EC2完成其工作。您已经在使用
URLFetch
将数据发送到EC2。只要它能够在60秒内将数据发送到EC2端,并且其大小不超过10MB,那么就可以了
- 您需要确保EC2端有一个能够从上面收集数据并发送回Ack的接收处理程序。Ack将足以让GAE方跟踪活动。然后,您可以始终在EC2端编写一些代码,将转换完成后的响应发送回GAE端,或者如您所述,如果需要,您可以发送电子邮件
- 我建议您在GAE端创建自己的小跟踪器。例如,当上传文件时,创建一个任务并立即将Ack发送回客户端。然后,您可以使用appengine端的Cron作业或任务队列将工作发送给EC2。不要等待EC2完成它的工作。然后让EC2向GAE报告其针对特定任务Id的工作已经完成,并发送电子邮件(如果需要)通知用户工作已经完成。事实上,EC2甚至可以报告它已完成的一批任务Id,而不是为每个任务Id发送通知
以下是一些要点:
- 对于问题1:您不需要在GAE端等待EC2完成其工作。您已经在使用
URLFetch
将数据发送到EC2。只要它能够在60秒内将数据发送到EC2端,并且其大小不超过10MB,那么就可以了
- 您需要确保EC2端有一个能够从上面收集数据并发送回Ack的接收处理程序。Ack将足以让GAE方跟踪活动。然后,您可以始终在EC2端编写一些代码,将转换完成后的响应发送回GAE端,或者如您所述,如果需要,您可以发送电子邮件
- 我建议您在GAE端创建自己的小跟踪器。例如,当上传文件时,创建一个任务并立即将Ack发送回客户端。然后,您可以使用appengine端的Cron作业或任务队列将工作发送给EC2。不要等待EC2完成它的工作。然后让EC2向GAE报告其针对特定任务Id的工作已经完成,并发送电子邮件(如果需要)通知用户工作已经完成。事实上,EC2甚至可以报告它已完成的一批任务Id,而不是为每个任务Id发送通知
以下是一些要点:
- 对于问题1:您不需要在GAE端等待EC2完成其工作。您已经在使用
URLFetch
将数据发送到EC2。只要它能够在60秒内将数据发送到EC2端,并且其大小不超过10MB,那么就可以了
- 您需要确保EC2端有一个能够从上面收集数据并发送回Ack的接收处理程序。Ack将足以让GAE方跟踪活动。然后,您可以始终在EC2端编写一些代码,将转换完成后的响应发送回GAE端,或者如您所述,如果需要,您可以发送电子邮件
- 我建议您在GAE端创建自己的小跟踪器。例如,当上传文件时,创建一个任务并立即将Ack发送回客户端。然后,您可以使用appengine端的Cron作业或任务队列将工作发送给EC2。不要等待EC2完成它的工作。然后让EC2向GAE报告其针对特定任务Id的工作已经完成,并发送电子邮件(如果需要)通知用户工作已经完成。事实上,EC2甚至可以报告它完成的一批任务ID,ins
from przm import przm_batchmodel
class OutputPage(webapp.RequestHandler):
def post(self):
form = cgi.FieldStorage()
thefile = form['upfile']
#this is where uploaded file will be processed and sent to EC2 for computing
html= przm_batchmodel.loop_html(thefile)
przm_batchoutput_backend.przmBatchOutputPageBackend(thefile)
self.response.out.write(html)
app = webapp.WSGIApplication([('/.*', OutputPage)], debug=True)
def loop_html(thefile):
#parses uploaded csv and send its info. to the REST server, the returned value is a html page.
data= csv.reader(thefile.file.read().splitlines())
response = urlfetch.fetch(url=REST_server, payload=data, method=urlfetch.POST, headers=http_headers, deadline=60)
return response