Как применяется крайний срок 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 будет завершен в течение микросекунд, но могут быть случаи, когда ему придется ждать дольше; например, если записи заблокированы транзакцией.

Другие вопросы по тегам