2016-04-22 3 views
1

Есть ли какой-нибудь pythonic способ получить все выполняемые/ожидающие задачи сельдерея для текущего пользователя django loggedin? Псевдокод для того, что я пытаюсь:django получить все работающие/ожидающие задачи сельдерея для текущего пользователя django

@celery.task 
    def process_task(user, task_to_do): 
     #get all running or pending(queued) task for current user 
     user_tasks = user.get_task(status=PENDING or status=STARTED) 
     if not user_task: 
      #allow user to schedule additional task 
      process.... 
     else: 
      return "Your previous tasks is already running" 

ответ

1

Это вообще сложная задача.

Прежде всего, необходимо реализовать inspecting of workers

inspector = app.control.inspect() 
scheduled = inspector.scheduled() 
reserved = inspector.reserved() 
active = inspector.active() 

сельдерея получат их от вашего брокера. Дело в том, что брокер не хранит информацию о пользователе, поэтому вам нужно добавить user к задаче kwargs.

user_task.delay(user=user)

Чем вы будете иметь возможность фильтровать результаты thees функций kwarg user в результате: [{'worker1.example.com': [{'eta': '2010-06-07 09:07:52', 'priority': 0, 'request': { 'name': 'tasks.usertask', 'id': '1a7980ea-8b19-413e-91d2-0b74f3844c4d', 'args': '[]', 'kwargs': '{'пользователь': '7'}'}}, ...

Проблема здесь - это будет медленным.

+0

Thats true. Позвольте мне объяснить, как я это сделал. Мое приложение также управляет статусом настраиваемых задач, поэтому я решаю, что, возможно, сохранение статуса задачи в базе данных может быть лучшим вариантом здесь. (Я создал модель под названием TaskUser) is_task_in_progress = False для задачи в TaskUser.objects.filter (user = map.owner) .exclude (status = 'SUCCESS'). Exclude (status = "FAILURE"). All (): celery_job = current_app.AsyncResult (task.task_id) , если celery_job.ready(): ... else: is_task_in_progress = True –