Gunicorn 允许配置请求超时,如下面的文档所示。这似乎是整个应用程序的全局配置。
是否可以为不同的端点配置不同的超时时间?也许会覆盖已知需要很长时间的 url 端点的默认超时?
http://docs.gunicorn.org/en/stable/settings.html#timeout
超时
-t INT, --超时 INT
30
工作人员沉默超过这么多秒将被杀死并重新启动。
一般设置为三十秒。只有在以下情况下才将其设置得明显更高: 您确信同步工作人员会受到影响。对于非同步 Workers 这只是意味着工作进程仍在通信 并且与处理单个事件所需的时间长度无关 请求。
没有简单的方法可以做你想做的事。也许最好的选择是将每个端点打包到一个单独的应用程序中,然后使用它们自己的单独的gunicorn进程/工作人员启动它们并具有适当的超时。然后放置像 nginx 这样的东西来将端点代理到不同的gunicorn进程。
我不知道这是不是一个好的解决方案。但我做了这样的事情:
pip install gevent
# 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()
gunicorn --bind 0.0.0.0:8000 MyProject.wsgi -k 'gunicorn_config.CustomWorker'