2014-02-28 6 views
9

Also habe ich eine Django App, die gelegentlich eine Aufgabe an Sellery zur asynchronen Ausführung sendet. Ich habe festgestellt, dass der Django-Entwicklungsserver bei der Entwicklung meines Codes in der Entwicklung erkennt, wie Codeänderungen automatisch erkannt werden, und starte den Server neu, damit ich meine Änderungen sehen kann. Der RabbitMQ/Sellerie-Bereich meiner App greift diese Art von Änderungen in der Entwicklung jedoch nicht auf. Wenn ich Code ändere, der später in einer Sellerie-Aufgabe ausgeführt wird, wird Sellery weiterhin die alte Version des Codes ausführen. Der einzige Weg, ich kann es auf die Änderung zu holen ist:Django, RabbitMQ, & Sellerie - warum macht Sellery alte Versionen meiner Aufgaben, nachdem ich meinen Django-Code in der Entwicklung aktualisiert habe?

  1. den Arbeiter Sellerie stoppen
  2. Anschlag RabbitMQ
  3. Reset RabbitMQ
  4. Start RabbitMQ
  5. fügen Sie den Benutzer zu RabbitMQ dass Meine Django-App ist so konfiguriert, dass sie
  6. verwendet entsprechende Berechtigungen für diesen Benutzer
  7. Neustart der Sellerie Arbeiter

Dies scheint jedoch ein weitaus drastischerer Ansatz zu sein, als ich eigentlich hätte nehmen müssen. Gibt es einen leichteren Ansatz, den ich verwenden kann?

Antwort

12

Ich habe festgestellt, dass ich auf meinem Code in der Entwicklung arbeiten, wie der Django Entwicklungsserver kennt erkennen automatisch, wenn der Code geändert hat und dann den Server neu starten, damit ich meine Änderungen sehen kann. Allerdings, der RabbitMQ/Sellerie Abschnitt meiner App nicht auf diese Arten von Änderungen in der Entwicklung abholen.

Was Sie hier beschrieben haben, ist genau richtig und wird erwartet. Denken Sie daran, dass Python eine module cache verwendet, so dass Sie den Python-Interpreter neu starten müssen, bevor Sie den neuen Code verwenden können.

Die Frage ist: "Warum nimmt Sellerie die neue Version nicht auf", aber so funktionieren die meisten Bibliotheken. Der Django-Entwicklungsserver ist jedoch eine Ausnahme. Es verfügt über einen speziellen Code, mit dem Python-Code bei Bedarf automatisch neu geladen wird. It basically restarts the web server without you needing to restart the web server.

Beachten Sie, dass Sie, wenn Sie Django in der Produktion ausführen, wahrscheinlich Ihren Server neu starten/neu laden müssen (da Sie den Entwicklungsserver nicht in der Produktion verwenden und die meisten Produktionsserver nicht versuchen, den Aufwand zu übernehmen des Implementierens einer problematischen Funktion zum Erkennen von Dateiänderungen und zum automatischen Neuladen des Servers).

Schließlich sollten Sie RabbitMQ nicht neu starten müssen. Sie sollten den Sellery-Worker nur neu starten müssen, um die neue Version des Python-Codes zu verwenden. Möglicherweise müssen Sie die Warteschlange löschen, wenn die neue Version des Codes jedoch die Daten in der Nachricht ändert. Beispielsweise erhält der Sellerie-Worker möglicherweise Version 1 der Nachricht, wenn er Version 2 erwartet.

Verwandte Themen