Daemon examples
Unlike scripting, daemon is long-living process, that's why
it provides some extra features:
-
Built-in
stop()andreload()methods -
Signal handling (by default
SIGHUPforcesDaemonUnitreload)
DaemonUnit
Same as ScriptUnit, the DaemonUnit is synchronous unit
and requires for implementation main_sync()
from systempy import DaemonUnit
from lib.unit import Example1Unit, Example2Unit, Example3Unit
class ExampleDaemonApp(
Example1Unit,
Example2Unit,
Example3Unit,
DaemonUnit,
):
def main_sync(self) -> None: ...
if __name__ == "__main__":
ExampleDaemonApp.launch()
Also check for example
LoopUnit
is (almost) subclass of DaemonUnit, but configured to run asynchronous
scripts and long-living jobs. It requires for implementation main_async()
Also you may pass loop_factory in kwargs. This feature is tested and works on
all supported python versions despite different implementation
from systempy import LoopUnit
from lib.unit import Example1Unit, Example2Unit, Example3Unit
class ExampleLoopApp(
Example1Unit,
Example2Unit,
Example3Unit,
LoopUnit,
):
async def main_async(self) -> None: ...
if __name__ == "__main__":
ExampleLoopApp.launch()
EventWaitUnit
is a subclass of LoopUnit, but already have implementation of main_async(),
which is actually doing infinite wait. It's useful, when all your units have
only startup and shutdown, but does not have own main
from systempy import LoopUnit
from lib.unit import Example1Unit, Example2Unit, Example3Unit
class ExampleInfiniteWaitApp(
Example1Unit,
Example2Unit,
Example3Unit,
EventWaitUnit,
): ...
if __name__ == "__main__":
ExampleInfiniteWaitApp.launch()
Also check for example
Run and Reload
Now you can run your daemon:
By default reload action bound to signals.SIGHUP on Unix.
Let's try to reload: