2017-04-11 47 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