3

我有一个用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中的内置功能卸载处理,以便用户在上传后得到响应并可以查询处理状态?

感谢您的任何帮助。

4

1 回答 1

8

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

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

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

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

于 2013-08-15T15:43:32.200 回答