2016-04-22 8 views
1

現在ログインしている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() 

セロリを実装する必要があります。ポイントは - ブローカーはユーザーに関する情報を保存しないので、をタスク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

Thats true。私がどのようにしたのか説明しましょう。私のアプリはカスタムタスクのステータスも管理しているので、ここでデータベースへのタスクのステータスを格納する方がより良いオプションになると判断します。 (TaskUserというモデルを作成しました) TaskUser.objects.filter(user = map.owner).exclude(status = 'SUCCESS')。exclude(status = "FAILURE")のタスクの場合は is_task_in_progress = ): celery_job = current_app.AsyncResult(task.task_id) celery_job.ready()の場合: ... else: is_task_in_progress = True –

関連する問題