Как развернуть многопроцессное приложение tornado websocket с супервизором?
У меня есть приложение (небольшая часть, ненужное пропускается):
# -*- coding: utf-8 -*-
import tornado.web
import tornado.httpserver
import tornado.ioloop
import tornado.websocket
import db_util # pg utility import
class SampleWebSocket(tornado.websocket.WebSocketHandler):
def open(self, *args, **kwargs):
print u"open Websocket"
do_init_stuff()
def on_message(self, data):
print u"%s BASE DATA RECIEVED:"
print data
do_on_message_stuff()
def on_close(self):
print u"WebSocket closed"
do_on_close_stuff()
def check_origin(self, origin):
# Allow connect from all domains
return True
def make_app(_settings):
routes = [
(r"/chat/sample/", handlers.SampleWebSocket),
]
app = tornado.web.Application(routes)
app.db = db_util.ConnectionRegistry()
return app
if __name__ == "__main__":
app = make_app()
port = 5001
app.db = db_util.ConnectionRegistry()
print " *** DEBUG:False, Starting Chat at port: %s" % port
server = tornado.httpserver.HTTPServer(app)
server.bind(port)
server.start(0) # actual number of cores == 2, so 2 subprocesses will be born
tornado.ioloop.IOLoop.instance().start()
Я пытаюсь развернуть его под наблюдением. Вот часть конфигурации супервизора:
[program:chat]
directory=/home/me/chat
command=/home/me/venv/bin/python2.6 /home/me/chat/main.py
process_name=%(program_name)s_%(process_num)01d
redirect_stderr=true
stdout_logfile=/tmp/chat.out.log
numprocs=1
numprocs_start=5001
Когда я запускаю его в первый раз с помощью $ supervisord -c supervisord.conf, он запускается, отвечает, но кажется, что supervisord не управляет дочерними процессами торнадо, поэтому, если я перезапускаю службу с перезапуском $ supervisorctl, у меня все еще есть живые дети торнадо, связанные с 5001 порт. И служба не может перезапустить правильно.
Итак, существует ли какой-нибудь способ настроить супервизор для торнадо с многопроцессорной обработкой?
1 ответ
В общем, если вы используете супервизор, вы должны использовать группы процессов супервизора вместо многопроцессного режима торнадо. Увеличение numprocs
в конфигурации супервизора и дать каждому процессу свой порт, передав --port=%(process_num)s
в командной строке (с подходящей опцией, определенной в самом приложении). Вам понадобится прокси, такой как nginx или haproxy, чтобы балансировать между процессами (или вы можете использовать передачу файлового дескриптора для совместного использования одного порта, как показано в https://gist.github.com/bdarnell/1073945, но это продвинутый использование и я рекомендую использовать прокси вместо этого).