2016-04-22 46 views
1

是否有任何pythonic方式來獲取當前登錄的django用戶的所有正在運行/掛起的芹菜任務?僞代碼爲我正在嘗試: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)

比你能夠通過kwarg user結果中過濾來自thees功能結果: [{'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

這是真的。讓我解釋我是如何做到的。我的應用程序也管理自定義任務狀態,所以我決定將任務狀態存儲到數據庫可能是更好的選擇。 (我創建了一個名爲TaskUser的模型) is_task_in_progress = False for Task in TaskUser.objects.filter(user = map.owner).exclude(status ='SUCCESS').exclusion(status =「FAILURE」)。all ): celery_job = current_app.AsyncResult(task.task_id) if celery_job.ready(): ... else: is_task_in_progress = True –