Mehrere Alarme aus SQL Datenbank / Logikfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Hallo Zusammen,

ich habe eine Logikfrage, wo ihr mir vielleicht weiterhelfen könnt. Und zwar habe ich eine SQL Datenbank mit verschiedenen Zeiten für verschiedene Events. Am Tag würden so 100 Events auftreten zu verschiedenen Uhrzeiten.

Liste_a=[123012, 125522,131934 ...].

Die Zeiten habe ich als Integer gewandelt und zu einer Zahl zusammengeführt, damit die Abfrage resourcensparender ist.
123012 entspricht also 12.30.12 Uhr... Die Localtime für die Abfrage wird auch in dem Format erzeugt --> 123009 z.B.

Wenn nun für die Zeit von Event X (z.B. 15.10.27) gleich der Localtime vom PC ist, soll ein Alarm auftreten --> ein Aufruf einer Funktion, die eine Audioausgabe ausgibt ("Bitte Event XY prüfen")

Mein Ansatz ist bisher (ich befürchte kein besonders resourcensparender Ansatz), die Liste mit den Eventzeiten dauerhaft in einer for Schleife zu durchlaufen und wenn SQL Time == Localtime ist, dann rufe die Funktion zur Audioausgabe auf.

Exemplarisch also so:

Code: Alles auswählen

def time_comparison():
	for row in Liste_a:
		time_CEST = time.localtime()
		sleep(1)
		if row == time_CEST:
	   		just_speak()		# Aufruf Sprachausgabe
	   		break
 	time_comparison()

Nun ist es halt so, dass ich da recht viele Events aus mehreren Listen prüfen will und da permanent rekursiv bspw. die Listen zu durchlaufen, erscheint mir ungünstig. Im Exemplar fehlt auch noch die Abbruchbedingung für die Rekursion, aber die habe ich der Einfachhalber weg gelassen.

Ein Nachteil an dem Exemplar ist auch, dass ich oft Zeiten in der Vergangenheit durchlaufe, obwohl ich die eigentlich nicht mehr brauche, wenn sie schon einmal aufgetreten sind. Also interessant sind nur die Zeiten in der Zukunft.

Im Internet habe ich viel nach Python Wecker Code geschaut, aber das passt leider nicht zu meinem Problem. Das Tool soll später auf Windows Systemen laufen...bei Linux gibt es crontabs, die zu einer definierten Uhrzeit starten...gibt es da eine sinnvolle Anwendung für mein Problem?! Wie die Alternative zu Windows aussieht, muss ich aber erst recherchieren, falls das in Frage käme.

Also meine Frage zu dem Problem: Gibt es eine elegantere Möglichkeit, die jeweiligen Zeiten in der Liste mit der Lokalzeit zu prüfen, ohne dauerhaft über die Liste zu iterieren? Ich habe extra eine Sekunde delay eingebaut, damit die Threads etwas entlastet werden. Trotzdem ist die Lösung nicht gut.

Möglich wäre das einmalige iterieren über die Liste und zu den Zeiten dann sowas wie ein Alarmevent zu kreiieren, welchen eine definierte Zeit hätte, z.B. Alarmevent_x_153722...fragt sich dann trotzdem, wie ich es hinkriege, dass dieses Event exakt um 15.37.22 aufgerufen wird, ohne eben permanent die Liste durchzulaufen.

Könnt ihr mir da hinweise geben?

Besten Gruß,
m.g.od.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Liste_a ist ein sehr schlechter Name, benutze keine kryptischen Abkürzungen oder Typen in Variablennamen; alarms wäre passend.
Zeiten in so einen komischen Format zu speichern macht dir nur das Leben schwer. Benutze passende Datentypen aus dem datetime-Modul. row für eine Zeit ist auch der falsche Name. Dass exakt ein Zeitpunkt getroffen wird ist schon so gut wie unmöglich. Dass das passiert, wenn ein Schleifendurchgang Minuten dauert, noch unwahrscheinlicher. Die Funktion rekursiv aufzurufen ist falsch, dafür gibt es Schleifen. Wenn du es selbst programmieren möchtest, dann musst du nur die Alarme sortieren und so lange mit sleep schlafen, bis der Zeitpunkt von der aktuellen Zeit aus erreicht ist.
Falls nicht, benutze das Modul sched.
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

Danke für den Hinweis mit der Sleepfunktion! Damit kann ich arbeiten. Der Hinweiß mit der Bezeichnung ist natürlich klar, es ist nur ein Exemplar. Im richtigen Quellcode ist die Bezeichnung sauber :-)

Besten Gruß & danke!
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

m.g.o.d hat geschrieben: Sonntag 12. Juli 2020, 13:27 Die Zeiten habe ich als Integer gewandelt und zu einer Zahl zusammengeführt, damit die Abfrage resourcensparender ist.
Zeiten werden als Integer repräsentiert mit praktischen Funktionen drumherum. Du hast es dir umständlicher gemacht aber es ist garantiert nicht signifikant resourcensparender.

Darüberhinaus solltest du Bedenken dass etwas zu erreichen wie "dass dieses Event exakt um 15.37.22 aufgerufen wird" grundsätzlich unmöglich ist. Das hat damit zu tun dass dein eigener Code in der Ausführung Zeit benötigt, dass noch andere Dinge auf dem Computer laufen werden und schliesslich dass Dinge schief gehen. Dein Program hat ein Bug und stürzt ab, wird gekillt vom Betriebssystem wegen OOM, vielleicht gibt es ein Hardware Problem etc. Wenn es dann neugestartet wird oder du es neustartet, könnte es sich aber immer noch sinnvoll sein das Event aufzurufen oder auch nicht. Es könnte dir auch passieren dass ein Zeitpunkt nie eintritt wegen Zeitumstellung o.ä.

Du wirst also den genauen Zeitpunkt fast immer etwas verpassen. Du musst dir deswegen überlegen was dann passieren soll, was wahrscheinlich davon abhängen sollte um wieviel der Zeitpunkt schon verpasst wurde. Es macht auch sicherlich Sinn versuchen zu messen wie groß der Unterschied in der Praxis ist um eingreifen zu können, wenn du merkst dass dir der zu groß wird.
Antworten