Skip to content

Daemon examples

Unlike scripting, daemon is long-living process, that's why it provides some extra features:

  • Built-in stop() and reload() methods

  • Signal handling (by default SIGHUP forces DaemonUnit reload)

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:

python my_daemon.py

By default reload action bound to signals.SIGHUP on Unix. Let's try to reload:

kill -HUP $YOUR_DAEMON_PID

It doesn't works right now due Windows does not supports signals