2013-04-30 3 views
0

Я создаю приложение, используя веб-футляр для бутылок.Как предотвратить попадание бутылки на обработку сигналов

Я хотел бы поймать сигналы USR1 и USR2, чтобы сделать некоторые работы в стороне от сервера бутылок. В основном я хочу иметь возможность перезагрузить конфигурацию, не закрывая веб-сервер, потому что хочу, чтобы некоторые объекты работали.

Я пытался обрабатывать сигналы (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

Вы не отправлял свой код, поэтому я предполагаю, что это может сводиться к чему-то вроде этого:

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), чтобы увидеть, есть ли новые данные.

Существует несколько причин, по которым это может быть лучше, чем использование сигналов, не в последнюю очередь из-за которых боль (или невозможность) сигнализировать каждому процессу, если вы когда-либо выполняете многопроцессорный процесс. Кроме того, вы не планировали запускать сервер разработки бутылок в производство, не так ли? (Это not recommended для всего, кроме самого маленького из приложений.) Учитывая, что, как только вы запускаете приложение «Бутылка» на другом веб-сервере, обработка сигналов становится сложной.

+1

Благодарим вас за ответ. Я не планировал использовать бутылку на производстве, но я где-то видел, что ее можно встроить в другой веб-сервер. Я буду следовать вашему предложению и обработать свое событие, используя файлы и pyinotify. – mistyrouge

+0

Прохладно, счастливо, что это помогло. И спасибо за упоминание pyinotify; Раньше я не слышал об этом - возможно, это спасло мне несколько часов, когда мне было что-то похожее на что-то подобное. –