Просроченные запросы и приложение - PullRequest
10 голосов
/ 17 сентября 2011

В рамках задачи я перебираю коллекцию элементов с запросом. После того, как каждая сущность выбрана из запроса, я также выполняю запрос URL. После итерации большого количества этих элементов я вижу следующую ошибку:

BadRequestError: The requested query has expired. Please restart it with the last cursor to read more results.

Что такое аренда запроса после его создания?

Ответы [ 3 ]

7 голосов
/ 29 ноября 2011

Эта проблема может пролить свет на вашу проблему: https://code.google.com/p/googleappengine/issues/detail?id=4432

Несмотря на то, что автономные запросы в настоящее время могут длиться до 10 минут (и фоновые экземпляры могут жить вечно) запросы к хранилищам данных все еще могут жить только 30 секунд. Мы планируем улучшить это, но так как «согласованное» представление данных сохраняется только в течение ограниченного периода времени. время, есть верхняя граница того, как долго может длиться запрос (который < 10 минут).

...

Вместо выполнения длинного запроса рассмотрите возможность получения пакетов из запрос с использованием курсоров запроса.

1 голос
/ 23 января 2012

Я написал простой помощник для этого - вы вызываете его с помощью batch_size, класса объекта для запроса и обратного вызова, который обрабатывает элементы в запросе.

(Обратите внимание, я использую djangoappengine и, следовательно, формат запроса django - но вы можете изменить его для соответствия.)

def loop_over_objects_in_batches(batch_size, object_class, callback):
    logging.info("Calling batched loop with batch_size: %d, object_class: %s, callback: %s" % (batch_size, object_class, callback))

    num_els = object_class.objects.all().count()
    num_loops = num_els / batch_size
    remainder = num_els - num_loops * batch_size
    offset = 0
    while offset < num_loops * batch_size:
        logging.info("Processing batch (%d:%d)" % (offset, offset+batch_size))
        query = object_class.objects.all()[offset:offset + batch_size]
        for q in query:
            callback(q)

        offset = offset + batch_size

    if remainder:
        logging.info("Processing remainder batch (%d:-)" % offset)
        query = object_class.objects.all()[offset:]
        for q in query:
            callback(q)
0 голосов
/ 29 ноября 2011

Простое создание отложенных задач для каждого элемента в вашей последовательности.Есть хорошая статья с примерами, как это сделать правильно " Фоновая работа с отложенной библиотекой ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...