我的Heroku Flask web应用程序如何支持N个用户同时下载图像文件?

我的Heroku Flask web应用程序如何支持N个用户同时下载图像文件?,flask,heroku,concurrency,Flask,Heroku,Concurrency,我正在使用Heroku开发一个Flask web应用程序。作为应用程序的一部分,用户可以请求从服务器下载图像。这将调用一个函数,该函数必须从我的云存储中检索多个图像(总共约500KB),应用一些格式,然后返回一个图像(约60KB)。它看起来像这样: @app.route('/download_image', methods=['POST']) def download_image(): # Retrieve about 500 KB of images from cloud storag

我正在使用Heroku开发一个Flask web应用程序。作为应用程序的一部分,用户可以请求从服务器下载图像。这将调用一个函数,该函数必须从我的云存储中检索多个图像(总共约500KB),应用一些格式,然后返回一个图像(约60KB)。它看起来像这样:

@app.route('/download_image', methods=['POST'])
def download_image():
    # Retrieve about 500 KB of images from cloud storage
    base_images = retrieve_base_images(request.form)
    
    # Apply image formatting into a single image
    formatted_image = format_images(base_images)

    # Return image of about 60 KB for download
    formatted_image_file = io.BytesIO()
    formatted_image.save(formatted_image_file, format='JPEG')
    formatted_image_data = formatted_image_file.getvalue()
    return Response(formatted_image_data,
                    mimetype='image/jpeg',
                    headers={'Content-Disposition': 'attachment;filename=download.jpg'})
我的文件是

web: gunicorn my_app:app
我如何设计/配置它以支持N个并发用户?比方说,我想确保我的应用程序能够支持100个不同的用户,所有用户都要求同时下载一个图像。由于有几个运动部件,我甚至不知道如何进行这项工作

另外,如果有人请求下载,但在下载完成之前就失去了internet连接,这会不会导致某种锁定,从而导致无休止的暂停,或者该线程/进程会在短时间后自动超时,从而顺利处理

我目前有1个dyno(在Heroku免费计划中)。如果需要,我愿意添加更多Dyno。

:

Gunicorn在每个dyno中分叉多个系统进程,以允许Python应用程序支持多个并发请求,而不要求它们是线程安全的。在Gunicorn术语中,这些被称为工作进程(不要与Heroku工作进程混淆,后者在自己的动态中运行)

建议为此设置设置配置变量。如果设置了
WEB\u并发性
环境变量,Gunicorn将自动接受该变量

heroku config:set WEB_CONCURRENCY=3
请注意,Heroku根据动态大小为您设置默认的
WEB\u并发性。您现在可能可以处理少量并发请求

然而,你不可能在一个免费的dyno上得到接近100个。本节出现在文档的前两部分之间:

每个分叉系统进程都会消耗额外的内存。这限制了在一个dyno中可以运行的进程数。对于典型的Django应用程序内存占用,您可以在
空闲
业余爱好
标准-1x
动态上运行2-4个Gunicorn工作进程。根据应用程序的特定内存需求,您的应用程序可能会允许这种情况的变化

即使您的应用程序非常轻量级,您也可能无法在一个小型dyno上超过6个工作人员。需要添加更多dynos和/或增加您运行的dynos数量

您真的需要支持100个并发请求吗?如果您有四个工作人员,那么可以同时满足四个用户的请求。如果第五名员工提出请求,则在其中一名员工释放之前,该请求不会得到响应。这通常是合理的

如果您的请求需要花费不合理的时间来完成,除了添加更多员工外,您还有一些选择:

  • 你能缓存生成的图像吗
  • 您能否立即返回响应,在后台作业中创建图像,然后通知用户图像已准备就绪?通过一些花哨的前端工作,这对最终用户来说是相当透明的
正确的解决方案将取决于您的特定用例。祝你好运