先描述下遇到的问题吧:
我在服务器上跑了 4 个 Tornado 进程,分布在 4 个不同的端口,用 nginx 映射到 80 端口。
当代码改动过后,我需要重启所有的 Tornado 进程。
使用 supervisorctl restart myapp:all 这种方式来重启时,大概有 10 秒的时间所有的访问都会出现 502 错误。
此外,由于 Supervisor 在结束进程时传递的是 TERM 信号,那些未处理完的请求可能也被直接扼杀了。
解决第一个问题的话,似乎可以依次重启每个 Tornado 进程,虽然有点麻烦。
或者是配置两组进程,先启动一组备用的,然后替换 nginx 配置到新端口,再干掉老的。
第二个问题似乎有点麻烦。我看 tornado.autoreload._reload(),其实也只是简单地关闭所有 sockets,然后 os.spawnv() 一个进程,再 exit 自己。
有没有办法让 Tornado 处理完现有的请求(最多等 10 秒),并且不接收新的请求,然后再退出?
我在服务器上跑了 4 个 Tornado 进程,分布在 4 个不同的端口,用 nginx 映射到 80 端口。
当代码改动过后,我需要重启所有的 Tornado 进程。
使用 supervisorctl restart myapp:all 这种方式来重启时,大概有 10 秒的时间所有的访问都会出现 502 错误。
此外,由于 Supervisor 在结束进程时传递的是 TERM 信号,那些未处理完的请求可能也被直接扼杀了。
解决第一个问题的话,似乎可以依次重启每个 Tornado 进程,虽然有点麻烦。
或者是配置两组进程,先启动一组备用的,然后替换 nginx 配置到新端口,再干掉老的。
第二个问题似乎有点麻烦。我看 tornado.autoreload._reload(),其实也只是简单地关闭所有 sockets,然后 os.spawnv() 一个进程,再 exit 自己。
有没有办法让 Tornado 处理完现有的请求(最多等 10 秒),并且不接收新的请求,然后再退出?