我有一个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
?
感谢您的帮助。
答案 0 :(得分:0)
我采用了一种实用的解决方案,即在芹菜任务中移动资源的所有依赖性检查(包括将不同步的依赖性推送到soap服务器)。而不是尝试根据资源的依赖性来序列化任务。
好的一面是它保持简单,我可以快速实现它。
不利的一面是我暂时锁定了一个工人,可能还有很多同步SOAP操作,而不是跨工人调度这些操作。