Django Celery结果将任务ID设置为人类可读的东西?

Ale*_*exW 12 python celery-task django-celery celerybeat

多天后,我有一个工作芹菜和芹菜节拍任务列表,结果使用django_celery_results存储.但是,当我查看表记录时,它没有任何有用的信息.

是否可以将任务ID设置为人类可读的东西?

结果

一个例子是使用demo任务,它返回no,但是一个不可读的任务id

tasks.py

@app.task
def test(a,b):
    return a + b
Run Code Online (Sandbox Code Playgroud)

app.settings中的调度程序

CELERYBEAT_SCHEDULE = {
    'test_task': {
        'task': 'home.tasks.test',
        'schedule': crontab(minute='*/1'),
    },
Run Code Online (Sandbox Code Playgroud)

bla*_*kev 5

简单的答案是否定的。该task_id属性是自动生成的。如果您向后跟踪代码,则生成 ID 的核心函数是 in kombu.utils.uuid.uuid(..),有趣的是,它只是围绕 builtin 的一个薄包装器uuid.uuid4(..)

但是,如果您查看函数签名:

def uuid(_uuid=uuid4):
    """Generate unique id in UUID4 format.
    See Also:
        For now this is provided by :func:`uuid.uuid4`.
    """
    return str(_uuid())
Run Code Online (Sandbox Code Playgroud)

..似乎可以提供您自己的生成ID的函数,只要它们是唯一的,它们就应该可以工作。从根本上说,你不得不补丁:celery.__init__.uuidcelery.utils.__init__.uuid,和celery.utils.__init__.gen_unique_id

我认为您无法应用有价值的名称,因为调用此函数时没有任何参数,只是为了返回唯一的内容。

如果您查看Task.apply并且Task.apply_async有一个未记录的参数task_id

这将允许您task_id 调用/创建任务之前手动指定,只要它们是全局唯一的,您仍然可以获得所有报告和指标。不幸的是,我没有看到任何简单的方法来改变task_id结果,使其在事后更有用......有点让你的 UI 的文本框有点傻。


如果您的项目是为它设置的,您可以使用任务继承并以这种方式修改任务行为。从理论上讲,您应该能够覆盖applyapply_async注入任务的 ID。

import time

from celery import Task

 class NamedTask(Task):
    id_gen = lambda: int(time.time() * 1000)


    def _gen_task_id(self):
        return {
            'task_id': '%s-%s' % (
                self.name,
                self.id_gen())}

    def apply(self, *args, **kwargs):
        kwargs.update(self._gen_task_id())
        return Task.apply(self, *args, **kwargs)

    def apply_async(self, *args, **kwargs):
        kwargs.update(self._gen_task_id())
        return Task.apply_async(self, *args, **kwargs)



@task(base=NamedTask)
def add(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

应该让你的任务 ID 看起来像: project.tasks.add-15073315189870


gle*_*ant -1

尝试:

@app.task(name="periodic_test")
def test(a, b):
    return a+b
Run Code Online (Sandbox Code Playgroud)

这可能有助于在 UI 中查找任务状态,但 Celery 始终需要为每个任务执行提供唯一的 id。