在gunicorn中为不同的端点配置不同的超时?

问题描述 投票:0回答:2

Gunicorn 允许配置请求超时,如下面的文档所示。这似乎是整个应用程序的全局配置。

是否可以为不同的端点配置不同的超时时间?也许会覆盖已知需要很长时间的 url 端点的默认超时?

http://docs.gunicorn.org/en/stable/settings.html#timeout

超时

-t INT, --超时 INT

30

工作人员沉默超过这么多秒将被杀死并重新启动。

一般设置为三十秒。只有在以下情况下才将其设置得明显更高: 您确信同步工作人员会受到影响。对于非同步 Workers 这只是意味着工作进程仍在通信 并且与处理单个事件所需的时间长度无关 请求。

python rest gunicorn session-timeout
2个回答
2
投票

没有简单的方法可以做你想做的事。也许最好的选择是将每个端点打包到一个单独的应用程序中,然后使用它们自己的单独的gunicorn进程/工作人员启动它们并具有适当的超时。然后放置像 nginx 这样的东西来将端点代理到不同的gunicorn进程。


0
投票

我不知道这是不是一个好的解决方案。但我做了这样的事情:

  1. 安装gevent
pip install gevent
  1. 为gunicorn创建一个自定义worker
# gunicorn_config.py

import gevent
from gunicorn.workers.ggevent import GeventWorker

ADMIN_TIMEOUT = 30  # second
API_TIMEOUT = 5


class CustomWorker(GeventWorker):
    def handle_request(self, listener_name, req, sock, addr):
        try:
            if req.path.startswith('/admin'):
                timeout = ADMIN_TIMEOUT
            else:
                timeout = API_TIMEOUT
           
            with gevent.Timeout(timeout):
                super().handle_request(listener_name, req, sock, addr)
        except gevent.GreenletExit:
            pass
        except SystemExit:
            pass
        except gevent.timeout.Timeout:
            print(f'timeout for {req.path}')
            raise StopIteration()

  1. 运行gunicorn:
gunicorn --bind 0.0.0.0:8000 MyProject.wsgi -k 'gunicorn_config.CustomWorker'
© www.soinside.com 2019 - 2024. All rights reserved.