(是吗?xD)
嗯,我在Celery项目中遇到以下情况。让我把你们全部放在一边。
我有很多任务使用API在我们通过Web服务使用的服务中进行一些配置(SOAP,我正在使用suds,但这是另一个故事)。
所以,我意识到所有的任务几乎都是一样的,直到配置的某些方面都是同样的流程:
configure_this - > configure_some_special_case_things - > configure_other_things - > configure_another_set_of_things
由于顺序并不重要,我可以在流程结束时配置特殊情况而没有任何问题,除了“special_case_configurations”之外的所有步骤在所有情况下都是相同的,所以我将这个逻辑抽象为某种东西像这样:
class BaseConfigurator(object):
def __init__(self, some_args, *args, **kwargs):
self.shared_state = some_args
def _configure_this(self):
#some steps that modifies the shared state
def _configure_other_things(self):
#some other steps that modifies the shared state
def _configure_another_set_of_things(self):
# another set of steps that modifies the shared state
def _special_case_steps(self):
# to be implemented by subclasses
pass
def configure(self):
self._configure_this()
self._configure_ahother_things()
self._configure_another_set_of_things()
self._special_case_steps()
然后......我将这个子类化并实现_special_case_steps
class ParticularConfigurator(BaseConfigurator):
def __init__(self, some_args, *args, **kwargs):
super(ParticularConfigurator, self).__init__(self, some_args, *args, **kwargs)
def _special_case_steps(self):
# actual implementation, this overwrites the parent's "pass"
所以,它以前的工作方式是几个“配置器”任务,称为“一般配置器”任务和“特殊情况配置器”任务,以便顺序进入celery.chain,所以,我有很多重复代码,我认为这种方式更优雅,这样我可以正确地重用我的“配置”方法。
我知道这一点 using class methods as celery tasks
所有命名警告,但出于任何原因,我试图对一些task_methods进行分组和链接,并且我在我的任务代码中没有直接使用的对象得到了几个酸洗错误,我在被调用的函数中使用它们我的task_method。
我通过在一个单独的任务中实例化我的配置器类来实现它,该任务区分我们配置的情况并决定调用哪个配置器。
@celery.task(queue='user_tasks', max_retries=3, default_retry_delay=120, on_success=handlers.configuration_success)
def run_configuration(case, data):
switch = {
'default': DefaultConfigurator # I know, this is not declared but it's just for the example, let's pretend it is a subclass of BaseConfigurator :-)
'custom': ParticularConfigurator
}
switch[case](data).configure()
现在,我很担心这一点,因为我没有利用celery.chain和celery.group的芹菜功能,我想这样我的代码运行速度比我能够链接和分组task_methods慢我是对的吗?
我应该继承Task而不是用实例方法创建任务吗?
感谢您抽出宝贵时间阅读。