Как применяется крайний срок 60-х годов для извлечения appengine .run и.fetch?
Документы appengine утверждают, что по умолчанию крайний срок для.run() и.fetch() составляет 60 секунд. Я хотел бы точно понять, как применяется этот крайний срок, особенно в контексте задачи или задания cron, где весь процесс может выполняться в течение 10 минут. Представьте, что у нас есть тысячи гусей:
geese = Goose.all().run(batch_size=100)
for goose in geese:
goose.cook()
# for sake of example, cooking a goose takes 1 second
Если я правильно понимаю, это приведет к извлечению 100 гусей из хранилища данных и приготовлению каждого из них по очереди. Когда он доберется до 61-го гуся, пройдет более 60 секунд, но это не имеет значения, потому что все 100 результатов были получены при вызове.run. После 100-го гуся он попытается получить следующую партию из 100 гусей, и это приведет к ошибке превышения крайнего срока. Это правильно?
Если предположить, что это правильно, то что если мы сделаем:
geese = Goose.all().run(batch_size=100, limit=100)
for goose in geese:
goose.cook()
# for sake of example, cooking a goose takes 1 second
Я предполагаю, что это будет выполнено без ошибки крайнего срока. Это правильно? Конечно, он получит только первые 100 гусей. если мы хотим 101-200, то нам нужно будет запросить снова, возможно, используя курсор.
Предполагая, что это правильно, какая разница в этой ситуации между
geese = Goose.all().run(batch_size=100, limit=100)
--- and ---
geese = Goose.all().fetch(batch_size=100, limit=100)
Для контекста: у нас есть довольно много или run (), и несколько fetch () в нашем производственном приложении, и мы видим случайные исключения из крайних сроков. Мы хотели бы их обосновать, но в документах немного не хватает того, как именно применяется крайний срок.
1 ответ
Нет, вы неправильно поняли, к чему относится крайний срок. Документы, на которые вы ссылаетесь:
Максимальное время ожидания в секундах, в течение которого хранилище данных возвращает результат, прежде чем прерывать работу с ошибкой
Здесь есть крайний срок - это вызов удаленной процедуры, который извлекает результат. Сколько времени вам потребуется, чтобы перебрать их, совершенно не имеет значения. Конечно, ваша ссылка на сбой при извлечении второго набора неверна: это два отдельных вызова, и время, затраченное на обработку результатов первого вызова, никак не влияет на второй вызов.
В нормальных условиях RPC будет завершен в течение микросекунд, но могут быть случаи, когда ему придется ждать дольше; например, если записи заблокированы транзакцией.