Seite 1 von 1
Thread programmieren Django
Verfasst: Donnerstag 6. August 2015, 19:36
von köttbullar
Hallo Forum,
ich bin Neuling in der Django Welt, hab allerdings schon einige Beispiele erfolgreich durchgespielt und mir ist die Funktionsweise einigermaßen klar.
Allerdings habe ich jetzt eine frage und zwar will ich meine SPS mit Modbus ansprechen was auch funktioniert nach diesem Beispiel:
https://code.google.com/p/pymodbus/
Code: Alles auswählen
from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient('192.168.0.12')
client.write_coil(1, True)
result = client.read_coils(1,1)
print result.bits[0]
client.close()
mit dieser Zeile:
result = client.read_coils(1,1)
wird der Zustand des Eingangs abgefragt.
Nun will ich aber, dass der Eingang immer abgefragt wird. Ich will nicht erst eine Funktion aufrufen.
sobald sich der Eingang ändert soll z.B. die Message erscheinen: "Eingang wurde gesetzt" bzw. "Eingang wurde zurückgesetzt"
Kann mir jemand sagen wie man sowas macht. Ich denke damit es etwas mit thread zu tun hat. Allerdings weiß ich nicht wie ich das programmieren soll. Wo soll ich den Thread programmieren in der manage.py?
vielleicht kann mir jemand kurz weiterhelfen
vielen Dank
Re: Thread programmieren Django
Verfasst: Donnerstag 6. August 2015, 19:59
von BlackJack
@köttbullar: Sobald sich der Eingang ändert ist ein bisschen schwierig, denn zumindest bis sich Websockets durchgesetzt haben, funktioniert das mit HTTP anders. Der Client muss immer regelmässig abfragen ob sich etwas geändert hat. Der Server kann den Client nicht von sich aus informieren.
Einen zusätzlichen Thread innerhalb von Django zu starten ist ausserdem etwas problematisch, zumindest wenn man sich nicht einschränken möchte wie die Webanwendung betrieben werden soll. Denn die Webanwendung selbst kann durchaus auch über mehrere Prozesse laufen.
Man könnte aber beispielweise einen eigenen Dienst für die Abfrage der Hardware laufen lassen der den aktuellen Zustand in der Datenbank hinterlegt. Und da kann die Webanwendung ihn dann abfragen und dem Benutzer ausliefern.
Re: Thread programmieren Django
Verfasst: Donnerstag 6. August 2015, 20:37
von köttbullar
ok, das habe ich verstanden.
dann will ich das Beispiel mit der Datenbank umsetzen.
Ich will sekündlich den Wert am Eingang abfragen und den Wert "1" oder "0" in die Datenbank eintragen.
wo soll ich den Thread programmieren, damit Django immer den Wert abfragt, egal in welcher Funktion ich mich befinde?
Re: Thread programmieren Django
Verfasst: Donnerstag 6. August 2015, 20:56
von BlackJack
@köttbullar: Wie gesagt: In Django eher gar nicht sondern als separater Dienst.
Re: Thread programmieren Django
Verfasst: Freitag 7. August 2015, 04:33
von köttbullar
Ok, das habe ich auch verstanden.
Wie ist dann die nächste Vorgehensweise? Soll ich eine Klasse importieren sobald ich "python manage.py runserver" ausführe.
Oder soll ich ein kleines Pythonskript starten sobald ich den Computer starte?
was ist programmtechnisch die saubere Lösung?
Re: Thread programmieren Django
Verfasst: Freitag 7. August 2015, 10:20
von kbr
@köttbullar: Ein separater Dienst ist ein eigenständiger Prozess. Wie z.B. die Datenbank, die Du von Django aus nutzt. Dann laufen die db-Prozesse im Hintergrund und müssen natürlich vor Deinem Django-Programm gestartet worden sein, damit dieses auf die db zugreifen kann.
So ist es auch mit dem separaten Dienst, der laufend aktuelle Daten in die db schreiben soll. Dieser ist auf die db als separat laufendem Prozess angewiesen, und Deine Django-Applikation dann auf beide. D. h. Du hast drei Anwendungen:
- - die Datenbank
- der Dienst, der Daten in die db schreibt
- die Django-Applikation
Und in dieser Reihenfolge sind sie auch voneinander abhängig.
Re: Thread programmieren Django
Verfasst: Freitag 7. August 2015, 17:59
von noisefloor
Hallo,
@köttbullar: willst du eigentlich den Messwert "nur" in Django haben oder am Ende eigentlich "live" auf der Webseite? Ich gehe mal von letzterem aus
Gruß, noisefloor
Re: Thread programmieren Django
Verfasst: Freitag 7. August 2015, 18:37
von köttbullar
Hallo
@noisefloor: Ja ich möchte den Wert in Echtzeit auf meiner Webseite haben.
warum macht dies Probleme? eigentlich nicht? ich starte beim Systemstart ein Skript das die Eingänge abfrägt.
Über Ajax werde ich dann die werte sekündlich abfragen und anzeigen oder nicht? macht das Probleme?
Re: Thread programmieren Django
Verfasst: Freitag 7. August 2015, 20:35
von noisefloor
Hallo,
nee, Probleme macht das nicht.
Nur muss Django server-seitig dann im Prinzip nicht "jederzeit" wissen, wie der aktuelle Messwert ist, sondern immer nur dann, wenn der AJAX-Request kommt.
Damit hast du zwei Möglichkeiten der Implementierung
1. führst du `result = client.read_coils(1,1)` jedesmal aus, wenn ein AJAX-Request kommt
2. wie schon vorgeschlagen führst du bei jedem AJAX-Request eine DB-Abfrage aus
Gruß, noisefloor