2017-04-11 42 views
0

我的想法是允許許多用戶向一個實例發出大量的發佈請求。假設實例被配置爲一次處理一個實例,我使用Celery和Redis作爲消息代理,儘管需要一些時間來異步完成每個人的任務。如何跟蹤Redis中某個用戶完成的Celery請求數量?

我的問題是如何查看或跟蹤某個用戶的任務完成了多少?例如,如果A人提出10次請求,我怎麼知道A人的所有請求是否在10分鐘後完成?

+0

太好了!感謝您的答覆。我想知道是否有辦法在不存儲用戶數據的情況下將所有請求從相同的持續請求收集到一個包中,但無法弄清楚這將如何工作。可能最好存儲用戶數據。 – StackyStack

+1

「查看或跟蹤」是什麼意思?您是否需要在終端上查看它,例如「芹菜檢查」,或者像網頁一樣顯示(例如在管理頁面中)? –

+0

我的目標是爲每個提出請求的人提供一個url中的唯一標識符,當人員進入頁面時,會收到兩條消息之一。 「所有任務都完成了」或「你的任務仍在進行中」 – StackyStack

回答

1

在你的http處理器獲取或定義userid。將它作爲參數傳遞給任務。使用redis來存儲統計信息。

class CallbackTask(Task): 
    def on_success(self, retval, task_id, args, kwargs): 
     db = redis.StrictRedis(host, port) 
     db.incr("succeed.tasks.user{userid}".format(**kwargs)) 
     # note: explicitly pass kwargs when schedule the task 
     # regular_task.apply_async(kwargs=dict(userid=self.get_user)) 

    def on_failure(self, exc, task_id, args, **kwargs, einfo): 
     db = redis.StrictRedis(host, port) 
     db.incr("failed.tasks.user{userid}".format(kwargs)) 


@app.task(base=CallbackTask) 
def regular_task(foo, bar, userid): 
    # do things 

獲取的統計數據在任何你需要的數據:

def get_succeed_tasks(db, userid): 
    return db.get("succeed.tasks.user{userid}".format(userid=userid)) 
+0

非常感謝。我一定會試試這個。 – StackyStack