我正在使用Bottle web-framework构建应用程序。
我想抓住USR1和USR2的信号来做瓶装服务器以外的工作。主要是我希望能够在不关闭Web服务器的情况下重新加载配置,因为我希望有一些对象可以继续使用。
我尝试使用以下方式处理信号(USR1和USR2):
signal.signal(signal.SIGUSR1, my_handler)
问题在于,收到sigUSR1后,瓶子网络服务器崩溃并跟踪以下内容:
Traceback (most recent call last):
File "giomanager.py", line 46, in <module>
run( giomanager, port=60200 )
File "/usr/lib/python2.7/dist-packages/bottle.py", line 2389, in run
server.run(app)
File "/usr/lib/python2.7/dist-packages/bottle.py", line 2087, in run
srv.serve_forever()
File "/usr/lib/python2.7/SocketServer.py", line 225, in serve_forever
r, w, e = select.select([self], [], [], poll_interval)
select.error: (4, 'Interrupted system call')
你知道为什么会这样吗?是否有可能阻止瓶子接收这些信号?
答案 0 :(得分:0)
你没有发布你的代码,所以我猜它可能归结为这样的东西:
import signal
from bottle import route, run
def my_handler(*args):
print 'in signal handler', args
signal.signal(signal.SIGUSR1, my_handler)
@route('/hello')
def hello():
return "Hello World!\n"
run(host='localhost', port=8080, debug=True)
顺便提一下,这对我有用 - 它打印在“信号处理程序中”。
但是:我真正想要建议的是,您会考虑另一种机制来刷新数据。我已经取得了很大成功,一个单独的刷新线程反复睡眠一段时间,然后唤醒并轮询某个文件(或url)以查看是否有新数据。
为什么这可能比使用信号更好,有几个原因,尤其是如果您运行多进程,那么发出每个进程的信号会很困难(或不可能)。此外,你没有计划在生产中运行Bottle开发服务器,不是吗? (除了最小的应用程序之外,它是not recommended。)鉴于此,一旦你在另一个网络服务器中运行你的Bottle应用程序,信号处理变得棘手。