【发布时间】:2014-06-26 06:58:20
【问题描述】:
我需要编写简单的带有 Web 界面的守护进程。
这个想法是使用python-daemon package 并在一个线程中运行wsgiref.simple_server。
Daemon 使用以下代码可以正常工作:
import daemon
import logging
import time
import signal
import threading
logfilename = '/var/log/testdaemon.log'
logger = logging.getLogger("DaemonLog")
logger.setLevel(logging.INFO)
formatter = logging.Formatter(
'%(asctime)s:%(levelname)s:%(message)s',
'%Y-%m-%d %H:%M:%S')
handler = logging.FileHandler(logfilename)
handler.setFormatter(formatter)
logger.addHandler(handler)
def initial_program_setup():
logger.info('daemon started')
def do_main_program():
while True:
time.sleep(1)
logger.info('another second passed')
def program_cleanup(signum, frame):
logger.info('daemon stops')
context.terminate(signum, frame)
def reload_program_config(signum, frame):
logger.info('reloading config')
context = daemon.DaemonContext()
context.signal_map = {
signal.SIGTERM: program_cleanup,
signal.SIGHUP: 'terminate',
signal.SIGUSR1: reload_program_config,
}
context.files_preserve = [handler.stream]
initial_program_setup()
with context:
do_main_program()
但是如果我像这样在initial_program_setup() 中启动一个线程:
def web_gui():
logger.info('weg gui started')
web = threading.Thread(target=web_gui)
web.setDaemon(True)
def initial_program_setup():
logger.info('daemon started')
web.start()
然后看起来守护进程在线程完成后退出。添加类似的东西
while True:
time.sleep(1)
到web_gui()(让线程永远运行,就像网络服务器应该的那样)使情况变得更糟:甚至web gui started 行也不会出现在日志中。
我的问题是:
- 为什么这不起作用?在守护进程中启动线程的正确方法是什么?
- 也许有更好的方法来通过 Web 界面控制守护进程?有了这样的架构,我想我应该为每个界面页面启动一个新线程,这很难扩展。
谢谢。
【问题讨论】:
标签: python multithreading daemon