您好我搜索了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.')
答案 0 :(得分:2)
我建议您需要将写入分解为批处理,因为写入操作会占用大量时间,否则您将超出每个请求的AppEngine最大CPU使用率。闯入批次的正确方法是拥有多个单独的请求,每个请求都会添加少量记录。
因此,对Initialize处理程序进行编码,以便您可以多次调用它,每次调用都会完成整个工作的一小部分。
答案 1 :(得分:1)
我在每10次放置后使代码休眠5秒
这不起作用,因为您的请求只能在超时之前花费一定的时间。进入睡眠只会计入这个限制。
您需要跨多个请求拆分操作,例如使用任务队列。
答案 2 :(得分:1)
需要考虑的其他事情是GAE有时会在应用程序静止一段时间后第一次请求出错/超时。似乎它需要一段时间来“唤醒”应用程序,如果它已经处于非活动状态几个小时,所以在这样的时间之后的第一个请求几乎自动出错。
您是否尝试在最初失败后重新执行请求?
答案 3 :(得分:1)
数据存储区超时更有可能发生大量推送,因此最简单的解决方案是以较小批量存储记录。如果您还没有执行时间(请求超时),则需要使用任务队列将操作分解为许多小请求。
答案 4 :(得分:1)