0

我有分布式硬件传感器节点,这些节点将被 celery 任务询问。每个传感器节点都有一个关联的对象,保存最近的读数和配置数据。

我永远不想超过一个 celery 任务来询问单个传感器节点。但是请求可能会在节点仍在处理之前的请求时询问节点。

我在任何 celery 文档中都没有看到任何此类任务跟踪的示例。但我认为这是一个相当普遍的要求。

我的第一个想法是在任务开始和结束时使用类似 task_in_progress 的标志来标记模型对象。

任务实例化中有什么东西可以用来更好地实现我的任务跟踪吗?

4

1 回答 1

1

您想要的是锁定给定资源上的任务,Celery 上有一个非常好的示例。

总结该示例建议使用缓存键来持有锁,任务将在启动之前检查锁键(您可以生成特定于实例的缓存键,如“sensor-%(id)s”)并仅在缓存时执行未设置密钥。

例子。

def check_sensor(sensor_id):
    if check_lock_from_cache(sensor_id):
        ... handle the lock ...
    else:
        lock(sensor_id)
        ... use the sensor ...
        unlock(sensor_id)

你可能真的想确保正确解锁(除了最后尝试)

这是芹菜示例http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

于 2012-04-16T22:44:46.347 回答