我使用celery更新新闻聚合站点中的RSS feed。我为每个提要使用一个@task,看起来一切正常。
有一个细节我不确定如何处理:所有提要每分钟都使用@periodic_task更新一次,但是如果提要仍在启动新任务时从上一个定期任务更新,该怎么办?(例如,如果Feed确实很慢或离线,并且任务在重试循环中进行)
目前,我存储任务结果并按以下方式检查其状态:
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)
也许我错过了一些使用芹菜机制来实现相同结果的更复杂/更可靠的方法?
根据官方文档: 确保一项任务一次只能执行一次 。