Истекшие запросы и приложения
В рамках задачи я выполняю итерацию по набору элементов с запросом. После того как каждый объект извлекается из запроса, я также выполняю 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)
Ответ 3
Простые создания отложенных задач для каждого элемента в вашей последовательности. Существует хорошая статья с примерами, как это сделать правильно " Фоновая работа с отложенной библиотекой".