Я использую сельдерей для обновления RSS-каналов на своем сайте агрегации новостей.Я использую один @task для каждого канала, и все, кажется, работает хорошо.
Есть деталь, с которой я не уверен, что буду хорошо обрабатывать: все каналы обновляются один раз каждую минуту с @periodic_task, но чтоесли лента все еще обновляется с последней периодической задачи при запуске новой?(например, если канал действительно медленный или находится в автономном режиме и задача удерживается в цикле повторов)
В настоящее время я сохраняю результаты задач и проверяю их состояние следующим образом:
import socket
from datetime import timedelta
from celery.decorators import task, periodic_task
from aggregator.models import Feed
_results = {}
@periodic_task(run_every=timedelta(minutes=1))
def fetch_articles():
for feed in Feed.objects.all():
if feed.pk in _results:
if not _results[feed.pk].ready():
# The task is not finished yet
continue
_results[feed.pk] = update_feed.delay(feed)
@task()
def update_feed(feed):
try:
feed.fetch_articles()
except socket.error, exc:
update_feed.retry(args=[feed], exc=exc)
Возможноесть более сложный / надежный способ достижения того же результата, используя какой-то механизм сельдерея, который я пропустил?