Funktionswarteschlange oder auch kooperatives Multitasking

Begonnen von Thorsten Pferdekaemper, 11 Oktober 2017, 22:15:10

Vorheriges Thema - Nächstes Thema

rudolfkoenig

ZitatIch denke, dass es in Perl besser ist, entweder not/or/and etc zu benutzen oder !/||&&, aber das nicht zu mischen.
Sorry, habe "not" uebersehen, ich verwende es uebelicherweise auch nicht. Habs jetzt gefixt.


ZitatDas mit der Array-Referenz war Absicht, damit man das auch einfach mit mehreren Parametern aufrufen kann.
Das habe ich auch nicht bezweifelt, mir ist aber eine Aehnlichkeit zum vergleichbaren InternalTimer Aufruf wichtiger.
Mehrere Parameter zu uebergeben ist so auch nicht wesentlich komplizierter:
PrioQueue_add(sub(){ Log 1, "Hallo $_[0]{a}" }, {a=>7,b=>2}, -1);

Thorsten Pferdekaemper

Zitat von: rudolfkoenig am 20 Oktober 2017, 08:46:17Mehrere Parameter zu uebergeben ist so auch nicht wesentlich komplizierter:
PrioQueue_add(sub(){ Log 1, "Hallo $_[0]{a}" }, {a=>7,b=>2}, -1);
Naja, schön ist aber anders, oder? In dem Fall würde ich mir wieder einen allgemeinen Wrapper für mehrere Parameter schreiben, oder eben mit InternalTimer wieder meine eigene Lösung basteln.
Es wäre schön gewesen, wenn wir das vorher mal kurz diskutiert hätten, dann hättest Du Dir den Aufwand vielleicht sparen können.
Ich fand es gerade gut, es anders zu machen als bei InternalTimer, da mich die Parameterübergabe dort schon immer gestört hat.
Gruß,
   Thorsten
FUIP

rudolfkoenig

ZitatThread dazu https://groups.google.com/forum/#!topic/fhem-users/y_rlL8POnlY/discussion
Danke. Darf ich fragen, wie du das rausgefunden hast?

Selbst nach dem durchlesen des Threads weiss ich aber nicht, wozu die +0.01 gut sein soll.

Thorsten Pferdekaemper

Zitat von: rudolfkoenig am 21 Oktober 2017, 12:38:25Selbst nach dem durchlesen des Threads weiss ich aber nicht, wozu die +0.01 gut sein soll.
Ich meinte eigentlich nicht diese Zeile, sondern die letzte Zeile der Routine:

return ($now+ 0.01 < $nextat) ? ($nextat-$now) : 0.01;

Das macht meiner Meinung nach einen Mindest-Delay von 10ms.
Die andere Zeile ($now += 0.01) führt meiner Meinung nach dazu, dass auch solche Einträge abgearbeitet werden, die eigentlich erst in 10ms "dran" sind. ...aber halt nur wenn mindestens ein Eintrag dabei ist, der tatsächlich "jetzt" abgearbeitet werden muss, da ja sonst der Block darüber zuschlägt (...und in dem Fall ohne die 10ms Delay).

Ich würde mal vermuten, dass die damaligen Probleme etwas damit zu tun hatten, dass das 10ms Delay das am Ende der Routine dazukommt, ggf dazu führen, dass manchmal Funktionen etwas zu spät ausgeführt werden. Das "$now += 0.01" könnte das in bestimmten Fällen korrigieren.
...aber seltsam ist das tatsächlich. Insbesondere sollte kein Modul darauf vertrauen, dass dieser Mechanismus auf 10ms genau funktioniert.

Gruß,
   Thorsten
FUIP

krikan

[OffTopic]
Zitat von: rudolfkoenig am 21 Oktober 2017, 12:38:25
Danke. Darf ich fragen, wie du das rausgefunden hast?
Suche mit den bekannten Fakten über Google-Groups (siehe Screenshot)
[/OffTopic]

Thorsten Pferdekaemper

Hi,
ich habe fest gestellt, dass das ganze mit apptime nicht funktioniert. apptime ersetzt die ganze HandleTimeout-Funktion, hat aber die prioQueues nicht dabei. Könnte das noch nachgezogen werden?

Übrigens:
Ich habe das mit den mehreren Parametern jetzt mit einem kleinen Wrapper gelöst:

sub PQadd ($$;$) {
    my ($func, $params, $niceness) = @_;
main::PrioQueue_add(sub {&{${$_[0]}[0]}(@{${$_[0]}[1]})}, [$func, $params], $niceness);
};

Das sieht vielleicht ein bisschen kryptisch aus, aber so kann ich es wieder mit einer Array-Referenz aufrufen ohne die eigentlichen Funktionen ändern oder mir jedesmal einen eigenen Wrapper basteln zu müssen.
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Hi,
zu apptime habe ich jetzt einen Thread in "Sonstiges" aufgemacht: https://forum.fhem.de/index.php/topic,78585.0.html
Gruß,
   Thorsten
FUIP