FHEM Forum

FHEM => Sonstiges => Thema gestartet von: kgie am 14 Juli 2026, 22:55:46

Titel: Non-blocking Write
Beitrag von: kgie am 14 Juli 2026, 22:55:46
Ich brauche in einem at-Device ein "Non-blocking" Write, weil ich einen Status alle paar Minuten auf ein Cloud-Laufwerk schreibe. Der Schreibvorgang dauert dabei teilweise länger.

Spricht etwas dagegen, das so zu machen:

writeStatus(), exit(0) if fhemFork() == 0;
In FHEM wird ja $SIG{CHLD} = 'IGNORE' gesetzt, so dass der Child-Prozess ordnungsgemäß entsorgt wird.

Oder gibt es eine einfachere Lösung?
(Blocking.pm scheint mir da zu viel.)
Titel: Aw: Non-blocking Write
Beitrag von: rudolfkoenig am 15 Juli 2026, 07:51:52
fhemFork zu verwenden ist einfacher als $hash->directWriteFn zu setzen, dafuer kostet es ein paar CPU-Zyklen mehr.
Titel: Aw: Non-blocking Write
Beitrag von: AdamZBRG am 14 August 2026, 04:36:02
Das stimmt zwar, aber man sollte bei fhemFork im FHEM-Kontext immer im Hinterkopf behalten, dass beim Forken der gesamte Perl-Interpreter-Zustand (inklusive aller offenen Filehandles, Sockets und Datenbankverbindungen) mitgeclont wird. Wenn der Schreibvorgang auf das Cloud-Laufwerk länger dauert und im Child-Prozess beispielsweise externe Bibliotheken oder Netzwerk-Sockets hängen bleiben, zieht das unnötig Ressourcen.
Für solche periodischen Cloud-Writes ist Blocking.pm am Ende vielleicht doch die sauberere und elegantere Wahl, weil das Framework dafür ausgelegt ist, Rückgabewerte sauber aufzufangen und den Prozesslifecycle ohne direkten Fork-Overhead im Modul zu steuern.
Titel: Aw: Non-blocking Write
Beitrag von: rudolfkoenig am 14 August 2026, 10:42:05
ZitatFür solche periodischen Cloud-Writes ist Blocking.pm am Ende vielleicht doch die sauberere und elegantere Wahl, weil das Framework dafür ausgelegt ist, Rückgabewerte sauber aufzufangen und den Prozesslifecycle ohne direkten Fork-Overhead im Modul zu steuern.
Blocking.pm verwendet fork(), und benoetigt/erzeugt eine telnet Instanz fuer die Rueckmeldung.