我不确定其他人是否有这个问题,但是当我在 appengine 开发服务器上使用游标链接任务时遇到异常“查询偏移量太大”(不确定它是否发生在现场)。
在单个查询中处理了 4000 多条记录后请求游标时发生错误。
我不知道偏移量与游标有什么关系,也许它只是 sdk 中用于应用程序引擎的一个怪癖。
要解决此问题,要么缩短任务延迟之前允许的时间(因此一次处理的记录更少),要么在检查时间过去时,您还可以检查处理的记录数是否仍在范围内。例如,如果 time.time() > end_time 或count == 2000。重置计数并推迟任务。2000 是一个任意数字,我不确定应该是什么限制。
编辑:
进行上述更改后,永远不会完成执行。正在调用 with_cursor(cursor) 代码,但似乎每次都从开头开始。我错过了一些明显的东西吗?
导致异常的代码如下:
表“Transact”有 4800 行。当 time.time() > end_time 为 true 时调用 transacts.cursor() 时会发生错误。在请求游标时已经处理了 4510 条记录,这似乎导致了错误(在开发服务器上,尚未在其他地方测试过)。
def some_task(trans):
tts = db.get(trans)
for t in tts:
#logging.info('in some_task')
pass
def test_cursor(request):
ret = test_cursor_task()
def test_cursor_task(cursor = None):
startDate = datetime.datetime(2010,7,30)
endDate = datetime.datetime(2010,8,30)
end_time = time.time() + 20.0
transacts = Transact.all().filter('transactionDate >', startDate).filter('transactionDate <=',endDate)
count =0
if cursor:
transacts.with_cursor(cursor)
trans =[]
logging.info('queue_trans')
for tran in transacts:
count+=1
#trans.append(str(tran))
trans.append(str(tran.key()))
if len(trans)==20:
deferred.defer(some_task, trans, _countdown = 500)
trans =[]
if time.time() > end_time:
logging.info(count)
if len(trans)>0:
deferred.defer(some_task, trans, _countdown = 500)
trans =[]
logging.info('time limit exceeded setting next call to queue')
cursor = transacts.cursor()
deferred.defer(test_cursor_task, cursor)
logging.info('returning false')
return False
return True
return HttpResponse('')
希望这可以帮助某人。
谢谢伯特