deployment - 如何使用supervisord部署tornado websocket多进程应用程序?

标签 deployment multiprocessing tornado supervisord

我有一个应用程序(小部分,不必要的被跳过):

# -*- 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()

我正在尝试使用supervisord 来部署它。这是supervisord配置的一部分:

[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 -csupervisord.conf 启动它时,它会启动、响应,但似乎supervisord不控制tornado子进程,所以如果我使用 重新启动服务$supervisorctl restart,我还有 Tornado 子活,绑定(bind)到5001端口。并且服务无法正确重启。

那么,是否存在某种方法可以通过多处理为 Tornado 配置supervisord?

最佳答案

一般来说,如果您使用supervisord,您应该使用supervisord的进程组而不是tornado的多进程模式。增加管理程序配置中的 numprocs 并通过在命令行中传递 --port=%(process_num)s 为每个进程指定不同的端口(在应用程序本身)。您需要像 nginx 或 haproxy 这样的代理来平衡进程之间(或者您可以使用文件描述符传递来共享一个端口,如 https://gist.github.com/bdarnell/1073945 中所示,但这是一种高级用法,我建议改用代理)。

关于deployment - 如何使用supervisord部署tornado websocket多进程应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983276/

相关文章:

deployment - 默认端口(8081)更改为 Windows 10 中 jfrog-artifactory-oss-7.3.2 中的不同端口

deployment - 在 ejb-jar.xml 中添加队列 JNDI 引用?在 EJB/MDB 中发送 JMS 消息

具有变量名的Python奇怪的多处理

python - 使用多个工作进程时 Odoo/OpenERP 中的高空闲负载

c++ - 可以 boost 不同 CPU 上的进程之间的共享内存

java - 如何将 webapp 打包为可部署的 war ?

perl - 部署 Perl 应用程序的好方法是什么?

django - 开发高性能、可扩展的 Comet 应用程序

javascript - 从远程域设置 cookie 以进行本地开发

python - 如何在 python Flask-tornado 应用程序中管理多个记录器