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

Deployment 如何使用supervisord部署tornado websocket多进程应用程序?,deployment,multiprocessing,tornado,supervisord,Deployment,Multiprocessing,Tornado,Supervisord,我有一个应用程序(小部分,跳过了不必要的部分): 我正试着和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=

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

我正试着和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不控制tornado子进程,所以如果我用$supervisorctl restart重新启动服务,我仍然有tornado子进程,绑定到5001端口。并且服务无法正确重新启动


那么,是否存在为tornado配置多进程supervisord的方法?

通常,如果使用supervisord,则应使用supervisord的进程组,而不是tornado的多进程模式。在supervisor配置中增加
numprocs
,并通过在命令行中传递
--port=%(process_num)s
给每个进程一个不同的端口(在应用程序本身中定义了一个合适的选项)。您需要像nginx或haproxy这样的代理来平衡进程(或者您可以使用文件描述符传递来共享一个端口,如中所示,但这是一种高级用法,我建议改用代理)。

看起来您完全正确。在关于龙卷风的书中,我找到了我的案例,引用:“部署团队的大多数轶事报告建议每个核心运行一个龙卷风进程。”此外,在一些研究之后,我发现,在这种情况下,ADS不能共享变量。所以,这个问题是由我对tornado原理和线程编程的误解引起的。
[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