2016-05-24 6 views
1

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:

  1. 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.
  2. 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?

Antwort

1

Persönlich würde ich Sellerie dafür verwenden; Ausführen von verzögerten Funktionsaufrufen ist seine Aufgabe. Und ich weiß nicht, warum es dort mehr ein Problem ist zu wissen, welche Nachrichten wohin gehören, als in einem Thread.

Aber Sie möchten vielleicht auch die neue Django-Channels Arbeit, die Andrew Godwin tut, untersuchen, da das asynchrone Hintergrundaufgaben unterstützen soll.

+0

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

Verwandte Themen