【问题标题】:How to deploy tornado websocket multiprocess application with supervisord?如何使用supervisord部署tornado websocket多进程应用程序?
【发布时间】:2015-01-14 23:45:15
【问题描述】:

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

# -*- 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 -c supervisord.conf 启动它时,它会启动、响应,但似乎 supervisord 不控制龙卷风子进程,所以如果我用 重新启动服务$ supervisorctl restart,我还有tornado childs住,绑定到5001端口。并且服务无法正确重启。

那么,是否存在某种方法来为具有多处理功能的龙卷风配置 supervisord?

【问题讨论】:

    标签: deployment multiprocessing tornado supervisord


    【解决方案1】:

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

    【讨论】:

    • 看来,你是完全正确的。在关于龙卷风的书中,我找到了我的案例,引用:“部署团队的大多数轶事报告建议每个核心运行一个龙卷风进程。”此外,经过一些研究,我发现在这种情况下,theads 不能共享变量。所以,问题是我对tornado原理和线程编程的误解造成的。
    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2015-09-16
    • 2019-09-25
    • 2019-07-02
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多