Ich erstelle einen Chatbot und brauche eine Lösung, um Nachrichten nach einer bestimmten Verzögerung in Zukunft an den Benutzer zu senden. Ich habe mein System mit Nginx, Gunicorn und Django eingerichtet. Die Idee ist, dass, wenn der Bot dem Benutzer mehrere Nachrichten senden muss, er jede nachfolgende Nachricht um eine gewisse Zeit verzögern kann, bevor er sie sendet, um "menschlicher" zu erscheinen.Wie füge ich einfache verzögerte Aufgaben in Django hinzu?
Eine einfache threading.Timer
Vorgehensweise funktioniert jedoch nicht, da der Benutzer diesen Prozess jederzeit unterbrechen kann, um zukünftige Nachrichten zu ändern, aber die Zeitgeber-Threads sind möglicherweise nicht verfügbar, da sie sich auf einem anderen Worker befinden. Bisher habe ich über zwei Lösungen kommen:
- Verwenden
threading.Timer
blind zu überprüfen, eine senden Liste in der Datenbank kann Probleme mit vielen unnötigen Threads erstellen. Macht auch die Datenbank weniger sauber/organisiert. - Verwenden Sie Sellerie oder ein anderes System, um diese zukünftigen Aufgaben auszuführen. Scheint wie Overkill und Over-Engineering ein einfaches Problem. Aufgaben werden immer nur Funktionsaufrufe verzögert. Auch ein Streit darum, welche Nachrichten zu welcher Konversation gehören.
Was wäre die beste Lösung für dieses Problem?
Auch eine allgemeinere Frage:
Idealerweise ist die beste Lösung wäre ein Rahmen sein, wo ich für jedes Gespräch einen neuen Bot ‚simulieren‘ kann, so dass es als eigene Einheit wirkt und hält den ganzen Staat/Nachrichten-Warteschlange Informationen im Speicher für sich. Es wäre notwendig, dass dieses Framework einem Bot nur dann Ressourcen zuweist, wenn es aufgrund einer voreingestellten Verzögerung oder einer eingehenden Nachricht etwas tun muss. Gibt es etwas, das so existiert?
Ich meinte den Umgang mit Abbruchaufgaben. Ich müsste die Aufgaben-IDs irgendwo speichern (ich vermute eine Datenbank), um zu wissen, welche Aufgaben für eine bestimmte Konversation abgebrochen werden müssen. Django-Channels sieht cool aus, ist aber immer noch etwas verwirrend für meinen Anwendungsfall (vielleicht Overkill). – PeterG