Thread programmieren Django

Django, Flask, Bottle, WSGI, CGI…
Antworten
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

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
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.
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

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?
BlackJack

@köttbullar: Wie gesagt: In Django eher gar nicht sondern als separater Dienst.
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

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?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
köttbullar
User
Beiträge: 34
Registriert: Donnerstag 6. August 2015, 19:23

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?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten