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.)
fhemFork zu verwenden ist einfacher als $hash->directWriteFn zu setzen, dafuer kostet es ein paar CPU-Zyklen mehr.
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.
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.