我正在使用Python 3.6.6,以及最新版本的Redis,Celery,Celery Beat和Celery Redbeat。
我目前正在使用Celery redbeat安排定期执行任务。一切正常,但是我看不到链接调度程序执行任务的明显方法,因此我可以检索其结果。
例如,由调度程序运行的任务在redis中显示为“ celery-task-meta-(task-id)”。在任务或调度程序中,我看不到任何链接。我知道我可以指定'options'参数并提供参数字典来修改任务执行,但是没有什么特别的。我正在寻找一种方法,可以将“ celery-task-meta”更改为与调度程序名称相对应的值,或者将完成的任务信息传播到调度程序的选项。我觉得我可能忽略了一些显而易见的事情,并希望您能提出宝贵意见。
在下面的输出中,我正在使用python redis库直接与redis代理进行交互:
>>> entry = RedBeatSchedulerEntry('nameoftask', 'tasks.test', interval, args=args, kwargs=kwargs, app=app, options={'dict of apply_async arguments'})
>>> r.hkeys('redbeat:nameoftask')
[b'meta', b'definition']
>>> r.hget('redbeat:nameoftask', 'meta')
b'{"last_run_at": {"__type__": "datetime", "year": 2018, "month": 10, "day": 2, "hour": 2, "minute": 9, "second": 42, "microsecond": 79758}, "total_run_count": 5}'
>>> r.hget('redbeat:nameoftask', 'definition')
b'{"name": "nameoftask", "task": "tasks.test", "args": [...], "kwargs": {...}, "schedule": {"__type__": "interval", "every": 360.0, "relative": false}, "enabled": true}'
>>> r.get('celery-task-meta-19ec44ba-3440-4f9f-9e0a-7fce2b59de13')
b'{"status": "SUCCESS", "result": {"current": 100, "total": 100, "status": "Task completed!", "result": {"task output": "result"}}, "traceback": null, "children": [], "task_id": "19ec44ba-3440-4f9f-9e0a-7fce2b59de13"}'
答案 0 :(得分:0)
最后,我无法使用redbeat调度程序找到任何机制。我最终创建了RedbeatEntryScheduler的子类,该类在调用due_next()时会检查是否存在与RedbeatSchedulerEntry对象的名称相关的键,然后将生成的任务的ID附加到该键/值对。
从Redis的角度来看,它看起来像这样:
>>> r.hget(b'redbeat:<task-name>-tasks', 'executed_tasks')
b'["d037db29-ef2c-4227-b7d3-6d19dc6ed68c", "ca4c509f-874f-4d87-80f1-
dcaf3f5f2fa0", "89733f21-272e-485f-b6b9-55dbdfd07fca"]'