我正在使用Gunicorn服务于我的烧瓶web应用程序。我的网络应用发送了一些请求,要求下载超过10GB的巨大文件,这需要一段时间才能完成。我正在使用生成器将进度输出流回到网页,因此连接保持打开状态,直到下载完成。我的问题是Gunicorn将在一定数量的秒后超时。
我将超时配置为更长:
/usr/bin/gunicorn -c /my/dir/to/app/gunicorn.conf -b 0.0.0.0:5000 wsgi --timeout 90
但是我不知道要花多长时间,所以如果下载的文件越来越大,我必须不断更改此超时时间。
我想知道是否有一种方法可以全部禁用超时,或者是否还有其他方法可以解决较长的下载时间。
答案 0 :(得分:0)
您使用Gunicorn指定的超时设置基本上是释放连接并重新启动工作程序。独角兽杀死了这些闲散的工人并重新启动了他们。 [1]
如果您正在流回响应,则是IMO,您的工作人员不应被父进程撞倒并杀死。请注意,如果主机未发送或接收任何数据,则连接处于空闲状态。
所以现在这是您可能想尝试的。这些是我的个人建议。
使用--threads
设置,并将其设置为大于1的值;这样,您的工作人员可能不会闲着,可能正在处理其他请求。 [2]
您可以尝试在请求的标头中提供超时,而不是在此处指定超时。为此,您需要了解Keep-Alive
标头。保持活动参数为timeout
。 [3]和[4]
使用multi-part
下载可加快大文件的下载速度。为此,您需要将下载分为几部分,然后可以发出并行请求以下载大文件。 [5]
因为您的目标似乎是要在网页上流回下载进度,所以不要使用轮询技术来保持连接的活跃和开放,而是使用轮询技术来获取下载进度。每隔250-400毫秒进行一次轮询以获取更新。这样,您的系统在慢速网络连接上也将更加健壮,并且可以扩展到任意大文件。需要注意的是,您需要以某种方式维护已下载多少文件的信息。我使用Actor框架亲自在Scala中构建了一个多部分的下载管理器。
另一个建议是,您可能还想尝试Flask-SocketIO之类的库。尽管这并不是真正的双向通信,但重点是要确保套接字保持打开状态以返回进度更新。 [6]