python-daemon - 运行 内部线程
python-daemon - running thread inside
我正在使用 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 停止我的服务
等待 60 秒后返回。我如何通过 systemctl 立即终止服务中的线程。我考虑将上下文传递给App,然后重新定义:
context.signal_map = {
signal.SIGTERM: app.shutdown,
signal.SIGHUP: app.shutdown,
}
然后向 App 添加一个关闭方法:
def shutdown(self, *args):
self.exit.set()
self.worker.join()
但是,这不会让上下文破坏 PID,也不会正确退出上下文。我还应该在关机方法中添加什么才能使事情正常工作?
库尔特
我的理解是否正确,您希望在终止主程序的同时也终止线程?您可以通过设置 daemon=True
:
来做到这一点
def run(self):
self.worker.daemon = True
self.worker.start()
我正在使用 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 停止我的服务
等待 60 秒后返回。我如何通过 systemctl 立即终止服务中的线程。我考虑将上下文传递给App,然后重新定义:
context.signal_map = {
signal.SIGTERM: app.shutdown,
signal.SIGHUP: app.shutdown,
}
然后向 App 添加一个关闭方法:
def shutdown(self, *args):
self.exit.set()
self.worker.join()
但是,这不会让上下文破坏 PID,也不会正确退出上下文。我还应该在关机方法中添加什么才能使事情正常工作?
库尔特
我的理解是否正确,您希望在终止主程序的同时也终止线程?您可以通过设置 daemon=True
:
def run(self):
self.worker.daemon = True
self.worker.start()