【问题标题】:uWSGI for uploading and processing filesuWSGI 用于上传和处理文件
【发布时间】:2013-08-17 19:08:04
【问题描述】:

我有一个用bottlepy 编写的python web 应用程序。它的唯一目的是允许人们上传将被处理的大文件(大约需要 10-15 分钟来处理)。

上传代码比较简单:

@route('/upload', method='POST')
def upload_file():
  uploadfile = request.files.get('fileToUpload')
  if not uploadfile:
    abort(500, 'No file selected for upload')

  name,ext = os.path.splitext(uploadfile.filename)

  if ext not in ['.zip','.gz']:
    abort(500, 'File extension not allowed')

  try:
    uploadfile.save('./files')

    process_file(uploadfile.filename) #this function is not yet implemented

    return "uploaded file '%s' for processing" % uploadfile.filename
  except IOError as e:
    abort(409, "File already exists.")

我计划使用 uWSGI 部署此应用程序(但是,如果其他技术更适合此目的,它并不是一成不变的。

因此,我对为此目的使用 uWSGI 有一些疑问:

  1. 如果文件上传需要几分钟,uWSGI 将如何处理其他客户端而不阻塞?
  2. 是否有任何方法可以使用 uWSGI 中的内置功能卸载处理,以便用户在上传后获得响应并查询处理状态?

感谢您的帮助。

【问题讨论】:

    标签: python uwsgi bottle


    【解决方案1】:

    如果文件上传需要几分钟,uWSGI 将如何处理? 在不阻塞的情况下处理其他客户端?

    它会阻塞。 一个解决方案是在uWSGI 前面放置一个像NGINX 这样的网络服务器,它预先缓冲POST 请求。所以文件上传实际上会绑定到 NGINX 处理程序,直到完成并然后传递给 uWSGI 处理程序。

    有没有什么方法可以使用内置卸载处理 uWSGI 中的功能,以便用户在上传后获得响应 可以查询处理状态吗?

    您需要创建一个任务队列系统来卸载 Web 处理程序的处理。 这是一个常见的最佳实践。只需四处寻找python task queues。 对于内置功能,它实际上取决于您需要卸载的任务。 您可以使用内置的uWSGI spooleruWSGI mules。 这些是典型任务队列的非常好的替代品(如非常著名的Celery),但有局限性。 只需在您的场景中自己尝试一下即可。

    【讨论】:

    • 这是 nginx 选项(默认开启)还是 uwsgi 选项?我相信我在使用 nginx 作为代理时发现了一些对此的引用,但在将它用于 uwsgi_pass 时却一无所获。
    • @invictus 默认为enabled。我认为甚至不可能禁用它。它在代理中特别有用。 uWSGI 是 Nginx 的上游代理 :)
    • uWSGI 有一些听起来很有趣的特性,比如spooler、mules、卸载子系统和队列框架。这些都不能用于卸载处理任务吗?
    • 是的,他们可以,但是您正在谈论上传,所以通常您需要某种形式的同步处理。顺便说一句,只要你在前面有一个缓冲代理(比如 nginx),这个区域就没有问题(uWSGI 只有在整个文件上传时才会被唤醒)
    • @roberto 并且文件不需要复制到 uWSGI,只传输打开的文件处理程序?
    猜你喜欢
    • 2014-11-13
    • 2012-12-27
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2013-08-31
    相关资源
    最近更新 更多