在我的本地机器上,这个脚本可以很好地运行,但在云端却总是500。这是一个定时任务,所以如果需要5分钟,我并不介意...
< class 'google.appengine.runtime.DeadlineExceededError' >:
有什么想法是否可以增加超时时间?
谢谢,rui
< class 'google.appengine.runtime.DeadlineExceededError' >:
有什么想法是否可以增加超时时间?
谢谢,rui
您不能超过30秒的时间限制,但是您可以通过使用任务队列间接增加超时时间-编写任务来逐步迭代数据集并处理它。每次运行此类任务时,当然应该符合超时限制。
更具体地说,您可以使用数据存储查询游标在相同位置恢复处理:
http://code.google.com/intl/pl/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors
首次引入于SDK 1.3.1:
http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html
关于数据库查询超时的规则非常复杂,但似乎一次查询不能超过约2分钟,而批处理不能超过约30秒。以下是一些使用游标将作业分成多个查询以避免超时的代码。
def make_query(start_cursor):
query = Foo()
if start_cursor:
query.with_cursor(start_cursor)
return query
batch_size = 1000
start_cursor = None
while True:
query = make_query(start_cursor)
results_fetched = 0
for resource in query.run(limit = batch_size):
results_fetched += 1
# Do something
if results_fetched == batch_size:
start_cursor = query.cursor()
break
else:
break
google.appengine.ext.ndb
库--我不知道是否需要该代码才能工作。from google.appengine.datastore.datastore_query import Cursor
def ProcessAll():
curs = Cursor()
while True:
records, curs, more = MyEntity.query().fetch_page(5000, start_cursor=curs)
for record in records:
# Run your custom business logic on record.
RunMyBusinessLogic(record)
if more and curs:
# There are more records; do nothing here so we enter the
# loop again above and run the query one more time.
pass
else:
# No more records to fetch; break out of the loop and finish.
break
.run(limit = batch_size)
吗? - phatmannbreak
无法被GAE预测,因此我认为GAE不能优化其DB RPC而没有limit
提供的提示。也许有人不是猜测可以发表意见? - tom