一尘不染

用celery运行“独特”任务

python

我使用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)

也许我错过了一些使用芹菜机制来实现相同结果的更复杂/更可靠的方法?


阅读 166

收藏
2020-12-20

共1个答案

一尘不染

根据官方文档:
确保一项任务一次只能执行一次

2020-12-20