Google App Engine Put()超时

时间:2009-12-25 13:43:40

标签: google-app-engine google-cloud-datastore

您好我搜索了App Engine群组但找不到明确的解决方案。

我想将1000个实体放入我的App Engine服务器(Production Server),但是我收到超时错误以及500个服务器错误。它在当地发展中完美运作。

为了减少Put负载,我在每10次put后使代码休眠5秒。我仍然有同样的错误:(

请指出正确的方向。非常感谢您的见解。

代码:

class User(db.Model)
   nickname = db.StringProperty()
   feed = db.StringListProperty()

class Initialize(webapp.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    start = 0
     end = 10

  #add 1000 users ( 10 Puts x 100 rows )
  for row in range(1,100):
    for i in range(start,end):
      nickname = "nickname" + str(i)
      feed = ["string1","string2","string3","string4","string5"]

      User(key_name=str(i),nickname=nickname,feed=feed).put()

      self.response.out.write('Entry %s done\n' % i)

    #add counters by 10
    start = start + 10
    end = end + 10

    #sleep
    time.sleep(5)

  self.response.out.write('Initialized 1000 users for Datastore.')

5 个答案:

答案 0 :(得分:2)

我建议您需要将写入分解为批处理,因为写入操作会占用大量时间,否则您将超出每个请求的AppEngine最大CPU使用率。闯入批次的正确方法是拥有多个单独的请求,每个请求都会添加少量记录。

因此,对Initialize处理程序进行编码,以便您可以多次调用它,每次调用都会完成整个工作的一小部分。

答案 1 :(得分:1)

  

我在每10次放置后使代码休眠5秒

这不起作用,因为您的请求只能在超时之前花费一定的时间。进入睡眠只会计入这个限制。

您需要跨多个请求拆分操作,例如使用任务队列。

答案 2 :(得分:1)

需要考虑的其他事情是GAE有时会在应用程序静止一段时间后第一次请求出错/超时。似乎它需要一段时间来“唤醒”应用程序,如果它已经处于非活动状态几个小时,所以在这样的时间之后的第一个请求几乎自动出错。

您是否尝试在最初失败后重新执行请求?

答案 3 :(得分:1)

数据存储区超时更有可能发生大量推送,因此最简单的解决方案是以较小批量存储记录。如果您还没有执行时间(请求超时),则需要使用任务队列将操作分解为许多小请求。

答案 4 :(得分:1)