Python Flask在大文件发布期间阻止其他请求

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\

我有一个更大的Flask RESTful API的组件,它的目的是将一个非常大的文件(几GB,特别是一个OVA虚拟化映像文件)作为POST主体,然后直接将其保存到块设备(在我的代码中被当作普通文件处理)

我面临的问题有两个:

(1) 在上传过程中,在调用
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
    的默认Flask
    run()
    。没有效果
  • 除了默认的Flask
    run()
    ,我还尝试了两种PyWSGI。没有效果
  • 对于PyWSHI,我尝试了monkey.patch_all()和not。没有效果
  • 我尝试过使用
    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