Ich bin "erfolgreich" Senden einer Nachricht von der Ansicht an den Client mit dem Status einer Gruppe von Aufgaben (keine tatsächliche Sellerie-Gruppe). Das Problem ist: Das ignoriert wirklich, ob alle Aufgaben tatsächlich ausgeführt werden. Ich habe versucht, einen Rückruf hinzuzufügen (task.apply_async(link=)
), aber das half auch nicht.django-channels/sellery: Wie kann ich den Fortschritt einer Liste von Aufgaben verfolgen?
Die Aufgaben selbst wirklich nicht viel Zeit in Anspruch nehmen, aber ich würde wirklich in der Lage sein mag, den Zähler zu erhöhen, wenn die Aufgabe ausgeführt tatsächlich wurde:
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)})})
Also zog ich den Code aus der Sicht und in den gleichen Block, der die Operation tatsächlich aufruft. Obwohl es bedeutete, dass ich jetzt viele Parameter passierte, löste dies das anfängliche Problem. Aber es stellt einen anderen dar: Eine Aufgabe mit einem Index von "1" kann nach einer Aufgabe mit einem Index "3" enden, und dies aktualisiert offensichtlich den Zähler falsch.
Was kann getan werden, um dies zu lösen?
Vielen Dank. Ich versuche, Umfragen zu vermeiden. Vielleicht kann ich Teile Ihrer Antwort übernehmen und irgendwo innerhalb einer for-Schleife nach etwas suchen, während die Aufgaben noch laufen. – zerohedge
Ich dachte mir **: (** Das Hauptproblem (zumindest für mich) ist, dass die Sellery - Mitarbeiter dazu neigen, auf anderen Servern als dem Webserver zu laufen, selbst wenn nicht, laufen sie in getrennten Prozessen, was die Kommunikation mit der Prozess, der es ziemlich schwierig schuf.Viel Glück damit, und wenn Sie es selbst lösen, können Sie hinzufügen, was Sie als Antwort auf Ihre eigene Frage getan haben? Das interessiert mich auch. – BorrajaX
Ich schaffte es tatsächlich früher heute. Es ist im Moment sehr klobig und kaum lesbar und scheint auch etwas spammig zu sein, aber es ist "asynchron". Ich werde die Antwort posten, sobald ich es Refactoring bekommen, aber hier ist die allgemeine Idee: Funktion Unterschriften sammeln, als Liste in eine Helferfunktion senden, dort, in einer for-Schleife, tun 'task.freeze()' und jede Aufgabe ID anhängen Starten Sie dann eine asynchrone Task, die diese Liste durchläuft, bis alle IDs "SUCCESS" (das sendet Nachrichten über Kanäle) zurückgibt. Nur dann task.apply_async() in einer ähnlichen for-Schleife. – zerohedge