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)
简单的答案是否定的。该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__.uuid,celery.utils.__init__.uuid,和celery.utils.__init__.gen_unique_id。
我认为您无法应用有价值的名称,因为调用此函数时没有任何参数,只是为了返回唯一的内容。
但
如果您查看Task.apply并且Task.apply_async有一个未记录的参数task_id!
这将允许您task_id 在调用/创建任务之前手动指定,只要它们是全局唯一的,您仍然可以获得所有报告和指标。不幸的是,我没有看到任何简单的方法来改变task_id结果,使其在事后更有用......有点让你的 UI 的文本框有点傻。
如果您的项目是为它设置的,您可以使用任务继承并以这种方式修改任务行为。从理论上讲,您应该能够覆盖apply和apply_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。