Периодические задания для каждого субъекта - PullRequest
2 голосов
/ 08 сентября 2011

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

Task(
    url="/keep_in_sync", 
    params={'entity_id':entity_id}, 
    name="sync-%s" % entity_id,
    countdown=3600
).add()

Внутри keep_in_sync все изменения сохраняются в модели, и новое задание планируется повторить позже.

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

Затем начинает казаться хорошей идеей создать скрипт, который проходит через каждую сущность и проверяет, что соответствующая задача действительно находится в очереди для нее. Но ни классы Task, ни Queue не имеют никакого метода для проверки, существует задача или нет.

Можете ли вы спасти хомяков и придумать лучший способ убедиться, что метод действительно наверняка периодически вызывается для каждой сущности?

Обновление

Похоже, что если вы хотите быть действительно уверенным в том, что задачи запланированы, вам нужно отслеживать свои собственные задачи, как предлагает Ник Джонсон. Не готов расстаться с удобной очередью задач, поэтому на данный момент просто допустим неопределенность невозможности проверить, действительно ли задачи запланированы или нет.

Ответы [ 2 ]

1 голос
/ 09 сентября 2011

Вместо постановки задачи на одну сущность обрабатывайте несколько сущностей в одной задаче.Это может быть вызвано, например, ежедневной работой cron, которая разветвляется на несколько задач.Помимо того, что вы гарантируете выполнение своего кода для каждой сущности, вы также можете воспользоваться асинхронным URLFetch для более эффективной синхронизации с внешним ресурсом, а также пакетного размещения и получения данных из хранилища данных для повышения эффективности обновлений.

1 голос
/ 08 сентября 2011

Вы получите исключение (TaskAlreadyExistsError), если в очереди уже есть такая задача (тот же URL и те же параметры). Так что не волнуйтесь, просто все они в очередь, и не забывайте ловить исключения.

Полный список исключений вы можете найти здесь: http://code.google.com/intl/en/appengine/docs/python/taskqueue/exceptions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...