Получение выполненных заданий из Celery Scheduler? - PullRequest
0 голосов
/ 02 октября 2018

Я использую Python 3.6.6 с последними версиями Redis, Celery, Celery Beat и Celery Redbeat.

В настоящее время я использую Celery Redbeat для планирования периодического выполнения задач.Все работает правильно, однако я не вижу очевидного способа связать задачи, которые выполняет планировщик, поэтому я могу получить их результаты.

Например, задача, запускаемая планировщиком, отображается в redis как 'celery-task-meta- (задача-идентификатор).Внутри задачи или планировщика я не вижу ничего связывающего их.Я знаю, что могу указать аргумент 'options' и указать набор аргументов для изменения выполнения задачи, однако ничто не выделяется.Я ищу способ изменить 'celery-task-meta' на значение, которое соответствует имени планировщика, или параметр, который будет передавать информацию о выполненной задаче планировщику.Я чувствую, что могу упустить что-то очевидное и был бы признателен за ввод.

В приведенном ниже выводе я напрямую взаимодействую с брокером Redis с помощью библиотеки Python 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"}'

1 Ответ

0 голосов
/ 08 октября 2018

В итоге мне не удалось найти какой-либо механизм, использующий планировщик redbeat.В итоге я создал дочерний класс RedbeatEntryScheduler, который при вызове due_next () проверяет наличие ключа, соответствующего имени объекта RedbeatSchedulerEntry, а затем добавляет идентификатор сгенерированной задачи к этой паре ключ / значение.

С точки зрения 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"]'
...