我已经分发了将由芹菜任务查询的硬件传感器节点。每个传感器节点都有一个关联的对象,用于保存最近的读数和配置数据。
我从不想要一个以上的芹菜任务询问一个单一的sensornode。但是请求可能会在节点仍在处理先前的请求时询问该节点。
我没有在任何芹菜文档中看到任何此类任务跟踪的示例。但我认为这是一个相当普遍的要求。
我的第一个想法是在任务的开始和结束时使用task_in_progress标记标记模型对象。
我可以使用任务实例化中的任何内容来更好地实现我的任务跟踪吗?
答案 0 :(得分: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