在app引擎上使用Cursor问题进行任务链接。例外:查询偏移太大。其他人得到这个问题?

时间:2010-08-15 16:22:15

标签: python google-app-engine task deferred-execution

我不确定是否有其他人有这个问题,但是当使用游标在appengine开发服务器上链接任务时,我得到一个异常“太大的查询偏移量”(不确定是否它发生在现场)。

在单个查询中处理了4000多条记录后请求游标时发生错误。

我不知道偏移量与游标有什么关系,也许它只是对应用程序引擎的sdk的一个怪癖。

要修复,要么缩短任务延迟之前允许的时间(因此一次处理的记录越少),或者在检查时间过去时,您还可以检查处理的记录数量是否仍在范围内。例如,如果time.time()> end_time或 count == 2000 。重置计数和延期任务。 2000是一个任意数字,我不确定应该是什么限制。

修改

进行上述更改后,永远不会执行。正在调用with_cursor(游标)代码,但似乎每次都从头开始。我错过了一些明显的东西吗?

导致异常的代码如下:

表“Transact”有4800行。当time.time()>时调用transacts.cursor()时发生错误。 end_time是真的。请求光标时已处理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('')

希望这有助于某人。

由于 伯特

1 个答案:

答案 0 :(得分: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()))

这适合我。