我的想法是允许许多用户向一个实例发出大型发布请求。假设实例配置为一次处理一个实例,我将 Celery 与 Redis 一起使用作为消息代理,以异步完成每个人的任务,尽管需要一些时间。
我的问题是,如何查看或跟踪某个用户的任务已完成多少?例如,如果人员 A 发出 10 个请求,我如何知道人员 A 的所有请求是否已在 10 分钟后完成?
在你的 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))