Python 请求应用程序引擎和EC2之间的超时

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实例,我想找到一些

我的webapp有两个部分:

  • 一种
    GAE
    服务器,处理web请求并将其发送到
    ec2rest
    服务器
  • 一个
    ec2rest
    服务器,它执行来自GAE的给定信息的所有计算并返回结果
  • 当计算简单时,它工作良好。否则,我将在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