Python Flask在大文件发布期间阻止其他请求
我有一个更大的Flask RESTful API的组件,它的目的是将一个非常大的文件(几GB,特别是一个OVA虚拟化映像文件)作为POST主体,然后直接将其保存到块设备(在我的代码中被当作普通文件处理) 我面临的问题有两个: (1) 在上传过程中,在调用Python Flask在大文件发布期间阻止其他请求,python,rest,flask,blocking,werkzeug,Python,Rest,Flask,Blocking,Werkzeug,我有一个更大的Flask RESTful API的组件,它的目的是将一个非常大的文件(几GB,特别是一个OVA虚拟化映像文件)作为POST主体,然后直接将其保存到块设备(在我的代码中被当作普通文件处理) 我面临的问题有两个: (1) 在上传过程中,在调用save()之前,Flask正在将文件写入临时文件。这是阻塞,在保存过程中(对于速度较慢的连接上的非常大的文件,最多需要几分钟),整个API都会被阻塞;对API的其他请求必须等待上载完成 (2) 我尝试通过延迟初始保存并使用自定义的stream\
save()
之前,Flask正在将文件写入临时文件。这是阻塞,在保存过程中(对于速度较慢的连接上的非常大的文件,最多需要几分钟),整个API都会被阻塞;对API的其他请求必须等待上载完成
(2) 我尝试通过延迟初始保存并使用自定义的stream\u factory
解析表单数据parse\u form\u data
来解决这个问题,它直接写入目标,而不是使用标准的Flask RESTful解析,然后调用save()
。这避免了写入临时文件(在我的例子中,这是一个双重写入,并且占用了大量临时空间),但是阻塞行为是相同的,只是发生在代码路径的稍后一点
我尝试过的事情:
save()
和自定义的parse\u form\u data
,如上所述。没有效果threaded=True
和不使用threaded=True
的默认Flaskrun()
。没有效果run()
,我还尝试了两种PyWSGI。没有效果os.set_blocking
来禁用自定义stream_factory
方法的阻塞。没有效果parse_form_data
,但是由于我必须join()
这样做以避免在上传完成之前继续执行其余代码,因此这也没有效果stream\u工厂
解决方案的地方找到;请注意,我这样做是为了尝试停止双重保存,而不是为了解决这个问题,但它显示了我正在处理的代码路径
这类问题让我感到困惑;我需要两者都支持这些大文件上传,但我不能让API在上传过程中阻止其他请求。有没有办法阻止这些大文件上传阻止对API的其他请求
编辑:我发现解决方案是对我的API使用Flask“debug”服务器。在这里,它可以在
threading=True
的情况下正常工作,没有moneypatch业务,而Gevent/PyWSGI没有,在我的用例中,“调试”服务器的功能已经足够了。考虑这个问题,不要提出一个解释或“适当”的解决方案。也试着在这里问一下,看看这个吗?芹菜只有在文件放在远端时才真正有用;这就是问题所在。你为什么不用装有枪的烧瓶呢?是否添加了足够的工作人员?@J.G.我在使用Guicorn,如果试图在另一个请求被阻止时发出请求,就会看到上面的错误。这对我很有帮助,谢谢!刚刚在命令中添加了--workers=3