Gunicorn - 如果客户端关闭他们的连接,如何杀死工人?

Posted

技术标签:

【中文标题】Gunicorn - 如果客户端关闭他们的连接,如何杀死工人?【英文标题】:Gunicorn--how to kill a worker if the client closes their connection? 【发布时间】:2019-04-15 13:06:40 【问题描述】:

我有一个在 gunicorn 下运行的烧瓶应用程序,它通过 REST api 处理客户端请求,后端占用大量 CPU;有些请求需要几分钟才能响应。

但这会产生自己的问题。例如,如果我运行一个小脚本来发出请求并终止它(ctrl-C 或其他),flask 应用程序会继续运行,尽管事实上当它从计算深度返回并获取时没有人会听到它它的管道坏了。

有没有办法在客户端连接断开后立即终止 API 调用(甚至只是杀死/重新启动工作人员)?这感觉像是 Gunicorn 可以处理的事情,但我无法找到任何可以解决问题的设置。

谢谢——这让我很烦恼!

【问题讨论】:

【参考方案1】:

可以使用以下代码杀死烧瓶工人:

from flask import request
def shutdown_server():
    func = request.environ.get('werkzeug.server.shutdown')
    if func is None:
        raise RuntimeError('Werkzeug server doesn't run flask')
    func()
    
@app.route('/shutdown', methods=['GET'])
def shutdown():
    shutdown_server()
    return 'Shutting down...'

要在 Linux 上杀死 Gunicorn 服务器,您可以使用我测试过的这个命令:

pkill gunicorn

这个命令在各种 Linux 上都可以完美运行,我假设你已经为服务器安装了它

或者如果我给你一个 Python 实现:

import os

def shutdownGunicorn():
    os.system("pkill gunicorn")

我不认为在请求完成后杀掉是聪明的,因为那样你就无法知道你什么时候会收到下一个请求。

Flask 在不工作时不会占用太多 CPU 和 RAM!

希望能给你答案!

【讨论】:

以上是关于Gunicorn - 如果客户端关闭他们的连接,如何杀死工人?的主要内容,如果未能解决你的问题,请参考以下文章

在 nginx/gunicorn/django Web 架构中有效处理长时间运行的 HTTP 连接

Gunicorn 配置参数

在 asp.net 核心服务器中处理关闭的 websocket 连接

Django+nginx+gunicorn搭建服务器后台

JAVA:处理套接字断开连接

linux 优雅的退出/关闭/重启gunicorn进程