2017-04-11 2 views
0

私の考えは、多くのユーザーが1つのインスタンスに対して大きなポストリクエストを行うことができるようにすることです。インスタンスが一度に1つのインスタンスを処理するように設定されていると仮定して、メッセージブローカーとしてCeleryをRedisと共に使用して、時間をかけてみんなのタスクを非同期的に完了させます。Redis内の特定のユーザーに対して完了したCeleryリクエストの数を追跡するにはどうすればよいですか?

私の質問は、特定のユーザーのタスクの完了数を確認または把握する方法です。たとえば、Aさんが10件のリクエストをした場合、10分後にAさんのリクエストがすべて完了したかどうかはどのように分かりますか?

+0

グレート!お返事をありがとうございます。私は、同じ永続的な要求からパッケージにすべての要求を収集することによってユーザーデータを格納せずにそれを行う方法があるかどうか疑問に思っていましたが、それがどのように動作するのか理解できません。ユーザーデータを保存するのが最善の方法です。 – StackyStack

+1

"見るか、追跡する"とはどういう意味ですか? 'セロリの検査 'のようなものでターミナルで見るか、ウェブページのように表示する必要がありますか? –

+0

私の目標は、ページに行くときに2つのメッセージの1つを受け取るという、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

関連する問題