У меня был большой успех с datetime на GAE.
from datetime import datetime, timedelta
time_start = datetime.now()
time_taken = datetime.now() - time_start
time_taken будет timedelta. Вы можете сравнить его с другой временной шкалой, которая имеет интересующую вас продолжительность.
ten_seconds = timedelta(seconds=10)
if time_taken > ten_seconds:
....do something quick.
Звучит так, как будто бы вам лучше справиться с использованием mapreduce или Task Queues. И то, и другое отлично подходит для работы с огромным количеством записей.
Более чистым шаблоном для кода, который вы имеете, является выборка только некоторых записей.
nobranches=TreeNode.all().fetch(100)
Этот код будет извлекать только 100 записей. Если у вас есть целых 100, когда вы закончите, вы можете бросить еще один элемент в очередь, чтобы запустить больше.
- На основании комментария о необходимости деревьев без веток -
Я не вижу вашу модель там, но если бы я пытался создать список всех деревьев без ветвей и обработать их, я бы: Получить ключи только для деревьев в блоках по 100 или около того. Затем я выбрал бы все ветви, которые принадлежат этим деревьям, используя запрос In. Заказ по дереву ключом. Просканируйте список ветвей, при первом обнаружении ключа дерева вытащите дерево ключей из списка. Когда вы закончите, у вас будет список «безветвленных» ключей дерева. Запланируйте каждый из них для обработки.
Более простая версия - использовать MapReduce на деревьях. Для каждого дерева найдите одну ветвь, которая соответствует его идентификатору. Если вы не можете, отметьте дерево для продолжения. По умолчанию эта функция будет тянуть партии деревьев (я думаю, 25) с 8 одновременными работниками. Кроме того, он управляет внутренними очередями заданий, поэтому вам не нужно беспокоиться о времени ожидания.