相关疑难解决方法(0)

芹菜任务和自定义装饰

我正在使用django和芹菜(django-celery)开展一个项目.我们的团队决定将所有数据访问代码(app-name)/manager.py包装在内(不要像管理员那样包装django),让(app-name)/task.py中的代码只处理汇编和执行芹菜任务(所以我们没有django此层中的ORM依赖项).

在我manager.py,我有这样的事情:

def get_tag(tag_name):
    ctype = ContentType.objects.get_for_model(Photo)
    try:
        tag = Tag.objects.get(name=tag_name)
    except ObjectDoesNotExist:
        return Tag.objects.none()
    return tag

def get_tagged_photos(tag):
    ctype = ContentType.objects.get_for_model(Photo)
    return TaggedItem.objects.filter(content_type__pk=ctype.pk, tag__pk=tag.pk)

def get_tagged_photos_count(tag):
    return get_tagged_photos(tag).count()
Run Code Online (Sandbox Code Playgroud)

在我的task.py中,我喜欢将它们包装成任务(然后可能使用这些任务来完成更复杂的任务),所以我写这个装饰器:

import manager #the module within same app containing data access functions

class mfunc_to_task(object):
    def __init__(mfunc_type='get'):
        self.mfunc_type = mfunc_type

    def __call__(self, f):
        def wrapper_f(*args, **kwargs):
            callback = kwargs.pop('callback', None)

            mfunc = getattr(manager, f.__name__)

            result = mfunc(*args, **kwargs)
            if callback:
                if self.mfunc_type == 'get':
                    subtask(callback).delay(result)
                elif …
Run Code Online (Sandbox Code Playgroud)

python django decorator celery django-celery

15
推荐指数
2
解决办法
1万
查看次数

具有多个装饰器的Celery任务不会自动注册任务名称

我有一个看起来像这样的任务

from mybasetask_module import MyBaseTask

@task(base=MyBaseTask)
@my_custom_decorator 
def my_task(*args, **kwargs):
    pass
Run Code Online (Sandbox Code Playgroud)

我的基本任务看起来像这样

from celery import task, Task

class MyBaseTask(Task):
    abstract = True
    default_retry_delay = 10 
    max_retries = 3 
    acks_late = True
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是芹菜工人正在用名称注册任务

'mybasetask_module.__inner'
Run Code Online (Sandbox Code Playgroud)

当我从任务中删除@my_custom_decorator或者我为这个任务提供一个显式名称时,该任务被正确注册(这是包+模块+函数)

from mybasetask_module import MyBaseTask

@task(base=MyBaseTask, name='an_explicit_task_name')
@my_custom_decorator 
def my_task(*args, **kwargs):
    pass
Run Code Online (Sandbox Code Playgroud)

这种行为有望吗?我是否需要做一些事情,以便在我有多个装饰器但没有明确的任务名称时,在第一种情况下使用默认的自动注册名称注册我的任务?

谢谢,

python decorator celery django-celery python-decorators

11
推荐指数
1
解决办法
2090
查看次数