我用芹菜更新我的新闻聚合网站的RSS订阅源。我为每个feed使用一个@task,事情看起来运行得很好。
但有一个细节我不确定是否能很好地处理:所有feed每分钟都会更新一次@periodic_task,但是如果一个feed在启动新的feed时仍在从上一个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)
也许有一种更复杂/更稳健的方法,可以使用我错过的芹菜机制来达到同样的效果?
根据MattH的回答,您可以使用这样的装饰:
然后,像这样使用它。。。
来自官方文件:Ensuring a task is only executed one at a time。
使用https://pypi.python.org/pypi/celery_once似乎做得很好,包括报告错误和针对某些参数进行唯一性测试。
你可以这样做:
只需要在项目中进行以下设置:
相关问题 更多 >
编程相关推荐