当前位置: 首页 > 面试题库 >

Running “unique” tasks with celery

戚飞雨
2023-03-14
问题内容

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

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


问题答案:

可以使用这样的装饰器:

def single_instance_task(timeout):
    def task_exc(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            lock_id = "celery-single-instance-" + func.__name__
            acquire_lock = lambda: cache.add(lock_id, "true", timeout)
            release_lock = lambda: cache.delete(lock_id)
            if acquire_lock():
                try:
                    func(*args, **kwargs)
                finally:
                    release_lock()
        return wrapper
    return task_exc

然后,像这样使用它…

@periodic_task(run_every=timedelta(minutes=1))
@single_instance_task(60*10)
def fetch_articles()
    yada yada...


 类似资料:
  • 此函数返回输入数组中的唯一元素数组。 该函数可以返回唯一值数组的数组和关联索引数组。 索引的性质取决于函数调用中返回参数的类型。 numpy.unique(arr, return_index, return_inverse, return_counts) Where, Sr.No. 参数和描述 1 arr 输入数组。 如果不是一维阵列,将会变平 2 return_index 如果为True,则返

  • UNIQUE The codebase for Uncertainty-aware blind image quality assessment in the laboratory and wild (TIP2021)and Learning to blindly assess image quality in the laboratory and wild (ICIP2020) Prequisi

  • Contents Running Graphs Session management class tf.Session class tf.InteractiveSession tf.get_default_session() Error classes class tf.OpError class tf.errors.CancelledError class tf.errors.UnknownEr

  • In this guide we are going to explain how to generate documentation for your application and how to tune it to your liking. phpDocumentor supports a wide range of options related to the generation of

  • IntelliJ提供了多种创建配置的方法。 本章讨论创建临时永久配置的选项。 它还讨论了在其他用户之间共享配置的方法。 创建临时配置 运行或调试Java类或测试用例时会创建临时配置。 请考虑以下步骤以了解其工作原理 - 创建一个Java类。 右键单击它并选择“运行”选项。 第一次运行后,临时配置将添加到运行菜单中。 创建永久配置 通过使用IntelliJ保存临时配置,可以将其转换为永久配置。 要保

  • Running Life(开源)是基于HealthKit和高德地图开发的健康跑步助手。 效果图 功能 .动态绘制跑步路径  智能判别跑步状态.  记录跑步数据生成分享小卡片、微信分享  条形图展示消耗卡路里 技术  MVVM架构  基于高德地图实现动态绘制轨迹 CMMotionManager判断跑步状态 贝塞尔曲线与帧动画 CoreData HealthKit 现状 项目处于不断完善和重构当中,目