Celery任务函数自定义属性

时间:2013-06-12 14:36:32

标签: python celery celery-task

我有一个芹菜任务函数,看起来像这样 -

@task(base=MyBaseTask)
@my_custom_decorator 
def my_task(*args, **kwargs):
    my_task.ltc.some_func() #fails - attribute ltc doesn't exist on the object

和my_custom_decorator看起来像这样

def my_custom_decorator (f):
    from functools import wraps
    ltc = SomeClass()
    @wraps(f)
    def _inner(*args, **kwargs):
        ret_obj = None
        try:
            f.task_cache = ltc
            ret_obj = f(*args, **kwargs)
        except Exception, e:
            raise
        return ret_obj
    _inner.ltc = ltc
    return _inner

我看到这是因为调用执行任务的实际可调用对象是celery任务类的对象。 如何在此对象上保留我的属性“ltc”,以便可以从上面显示的任务中访问它,即 - my_task.ltc.some_func()

谢谢,

1 个答案:

答案 0 :(得分:0)

我认为一种简单的方法是将ltc作为关键字参数引入..

@task(base=MyBaseTask)
@my_custom_decorator 
def my_task(*args, **kwargs):
    ltc = kwargs['ltc']
    ltc.some_func()
也许这样:

def my_custom_decorator (f):
    from functools import wraps
    ltc = SomeClass()
    @wraps(f)
    def _inner(*args, **kwargs):
        ret_obj = None
        try:
            f.task_cache = ltc
            kwargs['ltc'] = ltc
            ret_obj = f(*args, **kwargs)
        except Exception, e:
            raise
        return ret_obj
    _inner.ltc = ltc
    return _inner

我不知道是否有芹菜的任务方式来做到这一点。希望这会对你有所帮助。