実際のセロリグループではなく、タスクのグループのステータスで、クライアントからビューにメッセージを「正常に」送信しています。問題は:これは実際にすべてのタスクが実際に実行されているかどうかを無視します。私はコールバック(task.apply_async(link=)
)を追加しようとしましたが、それはどちらも役に立たなかった。自身が実際に多くの時間を取ることはありませんが、私は本当にタスクが実際に実行されたとき、カウンタをインクリメントできるようにしたいと思いdjango-channels/celery:タスクリストの進捗状況を追跡する方法は?
タスク:
if 'selected' in request.GET:
selected_as_list = request.GET.getlist('selected')
print(selected_as_list)
searches = list(set([s.strip() for s in selected_as_list if s.strip()]))
task_group = [refresh_func.s(str(user_profile.id), search, dont_auto_add=True) for search in searches]
for i,task in enumerate(task_group):
task.apply_async()
Group(str(request.user.id)).send({"text": json.dumps({"tasks_completed": i+1,
"task_id": "fb_import",
"completed": True if i == len(task_group) -1 else False,
"total": len(task_group)})})
だから私は、コードを移動します実際に操作を実行するのと同じブロックに移動します。今は多くのパラメータを渡していたことを意味しましたが、これは最初の問題を解決しました。しかし、それは別のものを提示する:インデックスが "1"のタスクは、インデックス "3"のタスクの後に終了することができ、これは明らかにカウンタを誤って更新する。
これを解決するには何ができますか?
ありがとうございます。私はポーリングを避けようとしています。たぶん私はあなたの答えの一部を採用することができ、何かのために、このループの中で、どこかでタスクが実行されている間、ループをチェックします。 – zerohedge
私は想像しています**:(**少なくとも、私にとっては、セロリの労働者はウェブサーバーとは異なるサーバーで動作する傾向があります。それはむしろ困難でした。しかし、あなたがそれをあなた自身で解決するならば、自分の質問に対する答えとしてあなたがしたことを加えることができますか?それは私にとっても興味深いものです。 – BorrajaX
今日私は実際にそれをやっていました。現時点では非常に控えめで読みにくいですが、少しスパムのようですが、それは「非同期」です。私はそれがリファクタリングされたら答えを投稿しますが、ここでは一般的な考え方です:関数シグネチャを収集し、ヘルパー関数にリストとして送信し、forループで 'task.freeze()'を実行して、すべてのIDの状態が "SUCCESS"(これはチャネルを介してメッセージを送信する)を返すまで、このリストを反復する非同期タスクを開始します。それだけで、同様のforループでtask.apply_async()を実行します。 – zerohedge