私はセロリを使用して、ニュースアグリゲーションサイトのRSSフィードを更新しています。フィードごとに1つの@taskを使用しますが、うまく機能しているようです。
ただし、うまく処理できるかどうかわからない詳細があります。すべてのフィードは@periodic_taskで1分ごとに更新されますが、新しいタスクが開始されたときにフィードが最後の定期的なタスクからまだ更新されている場合はどうなりますか?(たとえば、フィードが非常に遅い場合、またはオフラインで、タスクが再試行ループで保持されている場合)
現在、タスクの結果を保存し、次のようにステータスを確認しています。
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)
たぶん、私が見逃したセロリのメカニズムを使用して同じ結果を達成するためのより洗練された/堅牢な方法がありますか?