Autor Thema: Funktionswarteschlange oder auch kooperatives Multitasking  (Gelesen 456 mal)

Offline Thorsten Pferdekaemper

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3983
  • Finger weg von der fhem.cfg
Hi,
gibt es in FHEM schon so etwas wie eine "allgemeine Funktionswarteschlange"? D.h. ich habe mehrere Funktionen, die ich nacheinander ausführen will, aber nicht so, dass FHEM die ganze Zeit blockiert. Also in etwa eine allgemeine Implementierung davon:
sub f1() {
   blablabla
   InternalTimer(...,f2,...)
}

sub f2() {
   blubbblubbblubb
   InternalTimer(...f3,....)
}

BlockingCall hilft mir nicht viel, da die einzelnen Funktionen Devices anlegen bzw. ändern.

Schön wäre es, wenn man mehrere solcher Warteschlangen anlegen könnte, die dann mit unterschiedlichen Prioritäten quasi-parallel ablaufen. ...am besten noch mit Integration in die fhem.pl-Hauptschleife, so dass normale abgelaufene Timer (also die, die keine Warteschlangen zu benutzen), immer Vorrang haben.

Im Prinzip wäre das dann fast schon so etwas wie kooperatives Multitasking. Wenn es dazu schon etwas gibt, dann wäre das auch interessant.

Gruß,
    Thorsten
RasPi
Heizkessel-Steuerung per Arduino und HTTPMOD
und einen Haufen Homematic (Wired)

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17070
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #1 am: 12 Oktober 2017, 10:31:04 »
Zitat
gibt es in FHEM schon so etwas wie eine "allgemeine Funktionswarteschlange"
Noch nicht. Andererseits bin ich noch nicht ueberzeugt, dass im FHEM-Umfeld "kooperatives Multitasking" ein gute idee ist.

Zitat
BlockingCall hilft mir nicht viel, da die einzelnen Funktionen Devices anlegen bzw. ändern.
Wenn etwas lange dauert, dann kann man die Berechnung in einem BlockingCall auslagern, und die Ergebnisse dem Parent mitteilen, der dann die Aenderungen an den Datenstrukturen durchfuehrt. Calendar macht es mW auch so.

Offline Thorsten Pferdekaemper

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3983
  • Finger weg von der fhem.cfg
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #2 am: 12 Oktober 2017, 10:57:47 »
Noch nicht. Andererseits bin ich noch nicht ueberzeugt, dass im FHEM-Umfeld "kooperatives Multitasking" ein gute idee ist.
Meiner Meinung nach machen wir den problematischen Teil davon ja schon. FHEM vertraut darauf, dass die Module alles, was vielleicht etwas länger dauert, irgendwie auslagert (BlockingCall) oder in kleinere Häppchen aufteilt und dann per InternalTimer oder so quasi-nebenläufig abhandelt. Letzteres hätte ich gerne vereinfacht. Es müssen ja nicht wirklich Threads mit yield() etc. sein. Deshalb kam ich mit der "Funktionswarteschlange".

Zitat
Wenn etwas lange dauert, dann kann man die Berechnung in einem BlockingCall auslagern, und die Ergebnisse dem Parent mitteilen, der dann die Aenderungen an den Datenstrukturen durchfuehrt. Calendar macht es mW auch so.
Mein Problem ist, dass es gerade die Änderungen an den Datenstrukturen sind, die mir Probleme bereiten. Z.B. werden manchmal Geräte mit 26 Kanälen (oder sogar virtuelle Geräte mit 50 Kanälen) angelegt. Es gibt da nicht ganz sooo viel zu berechnen, aber das "saubere" CommandDefine und das setzen von Default-Attributen kostet Zeit.
Außerdem mag ich nicht, dass BlockingCall tatsächlich parallel läuft und damit das System belastet. Ich hätte gerne etwas, was sich sauber in die fhem.pl-Hauptschleife einreiht und nicht das System langsamer macht.
Natürlich könnte ich das alles mal wieder auch anders lösen, aber so eine Queue wäre praktisch.

Gruß,
   Thorsten


RasPi
Heizkessel-Steuerung per Arduino und HTTPMOD
und einen Haufen Homematic (Wired)

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 10986
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #3 am: 12 Oktober 2017, 11:31:16 »
Noch nicht. Andererseits bin ich noch nicht ueberzeugt, dass im FHEM-Umfeld "kooperatives Multitasking" ein gute idee ist.
Wenn etwas lange dauert, dann kann man die Berechnung in einem BlockingCall auslagern, und die Ergebnisse dem Parent mitteilen, der dann die Aenderungen an den Datenstrukturen durchfuehrt. Calendar macht es mW auch so.

Verwendet Calendar nicht seit neustem SubProcesses? Hatte doch erst letzte Woche deswegen im Modul gestöbert.



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 17070
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #4 am: 12 Oktober 2017, 13:14:18 »
Zitat
FHEM vertraut darauf, dass die Module alles, was vielleicht etwas länger dauert, irgendwie auslagert (BlockingCall) oder in kleinere Häppchen aufteilt und dann per InternalTimer oder so quasi-nebenläufig abhandelt.
Da gebe ich dir recht.

Meinst du wirklich, dass:
sub f1() {
   blablabla
   InternalTimer(...,f2,...)
}

sub f2() {
   blubbblubbblubb
   InternalTimer(...f3,....)
}
schlechter ist, als
sub f1() {
   blablabla
}

sub f2() {
   blubbblubbblubb
}
addToList(f1, param1);
addToList(f2, param2);
...
Und dabei muss man wissen, dass nach einem Select-Pruefung und Behandlung genau ein Element von dieser Liste abgearbeitet wird. Ich habe kein Problem sowas einzubauen (ist relativ trivial), wenn noch jemanden gibt, der sowas gerne haette.

Zitat
Verwendet Calendar nicht seit neustem SubProcesses?
Oder so.

Online CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 10986
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #5 am: 12 Oktober 2017, 13:17:40 »
Lustiger Weise hätte ich aktuell sogar Bedarf dafür. Ansonsten mache ich es wieder mit InternalTimer



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.me/MOldenburg
Mein GitHub: https://github.com/LeonGaultier

Offline Thorsten Pferdekaemper

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3983
  • Finger weg von der fhem.cfg
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #6 am: 12 Oktober 2017, 14:29:33 »
Meinst du wirklich, dass:
sub f1() {
   blablabla
   InternalTimer(...,f2,...)
}

sub f2() {
   blubbblubbblubb
   InternalTimer(...f3,....)
}
schlechter ist, als
sub f1() {
   blablabla
}

sub f2() {
   blubbblubbblubb
}
addToList(f1, param1);
addToList(f2, param2);
...
Ja, das meine ich.
Die einzelnen Funktionen werden z.T. in unterschiedlichem Kontext verwendet. D.h. ich müsste mir dann je nach Verkettung eigene Funktionen bauen. Z.B. kann es passieren, dass 3 Funktionen f1,f2,f3 mal direkt ausgeführt werden sollen, dann soll mal f1,f2,f3 als Sequenz (über die Queue) laufen und mal f1,f3,f1,f2,f1.   
Ich hätte auch gerne Prioritäten. Also z.B.: Ich würde gerne 50 mal f1 aufrufen, aber mit niedriger Priorität. D.h. "wenn FHEM gerade Zeit hat". Währenddessen sollen aber eingehende Messages (also über die Hardware) immer noch zu schnellen Updates der Readings führen. (Das mache ich auch asynchron, da es sonst immer Probleme gab.) So etwas ist mit verallgemeinertem Coding einfacher zu lösen als immer wieder neu.
 
Zitat
Und dabei muss man wissen, dass nach einem Select-Pruefung und Behandlung genau ein Element von dieser Liste abgearbeitet wird.
Genau so hätte ich das auch gerne. Mit InternalTimer werden auf einen Rutsch alle abgearbeitet, die gerade "dran" sind. D.h. wenn ich alles "dumm" gleichzeitig mit InternalTimer abschicke, dann blockiert das auch wieder. (Man sieht es im apptimer nur nicht mehr so gut.)   
Außerdem habe ich den Eindruck, dass die Sortierung bei der Abarbeitung von $intAt nicht unbedingt stabil ist. Ich bin mir nicht sicher, aber es scheint so ein bisschen Zufall zu sein, welche der Funktionen zuerst abgearbeitet wird, wenn die Timestamps gleich sind.

Zitat
Ich habe kein Problem sowas einzubauen (ist relativ trivial), wenn noch jemanden gibt, der sowas gerne haette.
Danke, aber ich wollte gerade keinen Aufwand verursachen. Ich würde gerne selbst daran arbeiten. Ich kann das ja dann hier wieder vorstellen und dann können wir ja sehen, inwiefern das standard-tauglich ist.

Danke&Gruß,
   Thorsten
RasPi
Heizkessel-Steuerung per Arduino und HTTPMOD
und einen Haufen Homematic (Wired)

Offline viegener

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3051
    • Meine Seite im fhemwiki
Antw:Funktionswarteschlange oder auch kooperatives Multitasking
« Antwort #7 am: 12 Oktober 2017, 22:43:09 »
Ich denke den Bedarf gibt es schon, ich habe das inzwischen in mehreren Modulen, die per httpUtils mit externen Devices kommunizieren. Auch der TelegramBot benutzt das, damit Anfragen hintereinander abgearbeitet werden. Für manche Fälle ist es nötig, da unter einer Authentifizierung nur ein request zu einer Zeit erlaubt ist. Ich denke eskann aber auch helfen die Systemlast zu begrenzen.


Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

 

decade-submarginal