【发布时间】:2016-03-19 11:43:59
【问题描述】:
我有一个 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,除非deps 中的所有实例都已由Celery 处理。换句话说,我需要序列化任务,以便尊重依赖顺序。
Celery 是这样运行的:
celery -A server worker -P eventlet -c 100
如何防止其中一个小事件(/process/thread)在其依赖项(如果有)被其他小事件运行完成之前运行a?
感谢您的帮助。
【问题讨论】: