检查Celery队列中的Python任务

时间:2016-03-19 11:43:59

标签: python django celery

我有一个Django + Celery应用程序,其中Celery用于将Django模型实例推送(和拉取)到第三方SOAP服务。

我的Django模型之间存在依赖关系,还有一个像这样的简单哈希:

class MyModel(Models):
    def get_dependencies(self):
        # ...
        return [...]

    def __hash__(self):
        return hash(self.__class__.__name__+str(self.pk))

这个哈希在我自己的实现中很方便,由于稳定​​性问题我不得不放弃。芹菜是一个更健全的地方。

当我将实例推送到SOAP服务时,我必须确保已推送其依赖项。这是通过检查pushed_ok时间戳字段的所有相关实例来完成的。

困难的部分是当一个实例a依赖于实例列表deps(所有都是MyModel子类的实例)时被推送。除非a中的所有实例都由Celery处理,否则我无法推送deps。换句话说,我需要序列化任务,以便尊重dependecies顺序。

芹菜是这样运行的:

celery -A server worker -P eventlet -c 100

如何阻止其中一个eventlets(/ process / thread)在其依赖项(如果有的话)被其他eventlet运行之前运行a

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我采用了一种实用的解决方案,即在芹菜任务中移动资源的所有依赖性检查(包括将不同步的依赖性推送到soap服务器)。而不是尝试根据资源的依赖性来序列化任务。

好的一面是它保持简单,我可以快速实现它。

不利的一面是我暂时锁定了一个工人,可能还有很多同步SOAP操作,而不是跨工人调度这些操作。