我有一个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
子类的实例)被推送时。除非 deps
中的所有实例都已由 Celery 处理,否则我无法推送a
。换句话说,我需要序列化任务,以便遵守依赖顺序。
芹菜是这样运行的:
celery -A server worker -P eventlet -c 100
如何防止其中一个事件(/process/thread)在其依赖项(如果有)由其他事件a
运行完成之前运行?
谢谢你的帮助。
我采用了一个务实的解决方案,将资源的所有依赖项检查(包括将不同步的依赖项推送到 soap 服务器)移动到 celery 任务中。而不是尝试根据资源的依赖项序列化任务。
好的一面是它保持简单,我可以快速实施它。
不利的一面是,我暂时锁定了一个工作线程,并且可能锁定了许多同步 SOAP 操作,而不是跨工作线程调度这些操作。