Gunicorn禁用超时

hon*_*ute 8 python-3.x gunicorn

我正在使用Gunicorn服务于我的烧瓶web应用程序。我的网络应用发送了一些请求,要求下载超过10GB的巨大文件,这需要一段时间才能完成。我正在使用生成器将进度输出流回到网页,因此连接保持打开状态,直到下载完成。我的问题是Gunicorn将在一定数量的秒后超时。

我将超时配置为更长,如下所示:

/usr/bin/gunicorn -c /my/dir/to/app/gunicorn.conf -b 0.0.0.0:5000 wsgi --timeout 90
Run Code Online (Sandbox Code Playgroud)

但是我不知道要花多长时间,所以如果下载的文件越来越大,我必须不断更改此超时时间。

我想知道是否有一种方法可以全部禁用超时,或者是否还有其他方法可以补救较长的下载时间。

Arc*_*oor 4

您使用 Gunicorn 指定的超时设置基本上是释放连接并重新启动工作线程。Gunicorn 杀死这些空闲的工人并重新启动他们。[1]

如果您正在流回响应,那么在我看来,您的工作人员不应该被父进程击倒并杀死。请注意,如果主机没有发送或接收数据,则连接处于空闲状态。

所以现在您可能想尝试一下。这些是我个人的建议。

  • 使用--threadssettings,设置为大于1的值;这样,您的工作人员就不会闲着,可以处理其他请求。[2]

  • 您可以尝试在请求标头中提供超时,而不是在此处指定超时。为此,您需要了解Keep-Alive标头。Keep-Alive 有一个timeout参数。[3][4]

  • 使用multi-part下载可以加快大文件的下载速度。为此,您需要将下载分解为多个块,然后您可以发出并行请求来下载该大文件。[5]

  • 由于您的目标似乎是希望将下载进度流回网页上,因此不要保持连接处于活动状态并打开,而是使用轮询技术来获取下载进度。例如,每隔 250-400 毫秒进行一次轮询以获取更新。通过这种方式,您的系统在慢速网络连接上也将更加稳健,并且可以针对任意大文件进行扩展。需要注意的是,您需要以某种方式维护已下载文件量的信息。我亲自使用 Actor 框架在 Scala 中构建了一个多部分下载管理器。

  • 还有一个建议是,您可能还想尝试像 Flask-SocketIO 这样的库。虽然这并不是真正的双向通信,但重点是确保套接字保持打开状态以返回进度更新。[6]