python-daemon - запущенный поток внутри

Я использую python-daemon, но у меня есть поток внутри демона для периодической проверки последовательного порта:

context = daemon.DaemonContext(pidfile=daemon.pidfile.TimeoutPIDLockFile('/var/run/gpstemp.pid'),
                          uid = 0,
                          gid = 4,
                          umask = 0o002,
                          stdout = sys.stdout,  # change these for deployment
                          stderr =sys.stderr,   # change these for deployment
                          chroot_directory= None,
                          working_directory='/home/debian/gpstemp'
app = App()
with context:
    app.run()

Поток запускает это:

class App():
    def __init__(self, port = 5556):
    ...
        # Handle all those threading things
        self.__sem = Lock()
        self.interval = 60.0  # interval between time updates in seconds
        self.worker = Thread(target = self._get_datetime_worker)
    def run(self):
        self.worker.start()
...
    def _get_datetime_worker(self):
        while not self.exit.is_set():
            self._get_datetime()
            self.exit.wait(self.interval)

Я использую systemctl, чтобы запустить и остановить его с помощью файла.service. Когда я запускаю: sudo systemctl stop myservice

Он ждет 60 секунд, прежде чем вернуться. Как бы я убил свою ветку в сервисе сразу через systemctl. Я подумал о передаче контекста в приложение, а затем переопределить:

 context.signal_map = {
     signal.SIGTERM: app.shutdown,
     signal.SIGHUP: app.shutdown,
     }

и затем добавление метода выключения в приложение, которое делает:

def shutdown(self, *args):
    self.exit.set()
    self.worker.join()

Но это не позволяет контексту уничтожить PID и не покидает контекст правильно. Что еще я должен добавить к методу завершения работы, чтобы все работало правильно?

Kurt

1 ответ

Решение

Правильно ли я понимаю, что вы также хотите уничтожить поток, когда убиваете свою основную программу? Вы можете сделать это, установив daemon=True:

def run(self):
    self.worker.daemon = True
    self.worker.start()
Другие вопросы по тегам