App Engine中任务链与游标问题:异常:查询偏移太大。有人遇到过这个问题吗?

2 投票
1 回答
509 浏览
提问于 2025-04-16 02:49

我不知道其他人是否也遇到这个问题,但我在使用游标来连接任务时,在appengine开发服务器上遇到了一个异常,提示“查询偏移量太大”。(不确定在正式环境中是否也会出现这个问题。)

这个错误发生在处理了4000多条记录后,再请求游标的时候。

我之前不知道偏移量和游标有关系,可能这只是app engine SDK的一个小问题。

要解决这个问题,可以缩短任务被延迟的时间(这样每次处理的记录就会少一些),或者在检查时间的同时,也检查一下处理的记录数量是否在合理范围内。比如,如果time.time() > end_time或者count == 2000,就重置计数并延迟任务。2000这个数字是随便定的,我也不确定具体的限制应该是多少。

编辑:

在做了上面提到的修改后,代码似乎一直没有执行完。with_cursor(cursor)的代码被调用,但每次似乎都是从头开始。难道我漏掉了什么明显的东西吗?

导致异常的代码如下:

表“Transact”有4800行。当time.time() > end_time为真时,调用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('')

希望这能帮助到某些人。

谢谢,
Bert

1 个回答

1

再试一次,不要使用iter这个功能:

#...
CHUNK = 500
objs = transacts.fetch(CHUNK)

for tran in objs:
    do_your_stuff

if len(objs) == CHUNK:
    deferred.defer(my_task_again, cursor=str(transacts.cursor()))

这个对我来说有效。

撰写回答