Истекшие запросы и приложения

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

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

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

Ответ 1

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

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

...

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

Ответ 2

Я написал простой помощник для этого - вы вызываете его с помощью 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)