如何防止瓶子处理信号

时间:2013-04-30 15:06:42

标签: python signals bottle

我正在使用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')

你知道为什么会这样吗?是否有可能阻止瓶子接收这些信号?

1 个答案:

答案 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应用程序,信号处理变得棘手。