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
DB query超时的确切规则很复杂,但似乎一个查询的生存时间不能超过2分钟,而一个批处理的生存时间不能超过30秒。下面是一些代码,它将一个作业分解为多个查询,使用游标来避免这些超时。在
下面是我用来解决这个问题的代码,通过将一个大查询分解成多个小查询。我使用
google.appengine.ext.ndb
库,我不知道下面的代码是否需要它。在(如果您不使用ndb,请考虑切换到它。它是db库的改进版本,迁移到它很容易。有关详细信息,请参见https://developers.google.com/appengine/docs/python/ndb。)
您不能超过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
相关问题 更多 >
编程相关推荐