我有一个用 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 用于此类目的有一些疑问:
- 如果文件上传需要几分钟,uWSGI如何能够在不阻塞的情况下处理其他客户端?
- 有没有什么方法可以使用uWSGI中的内置功能来卸载处理,以便用户在上传后得到响应并可以查询处理状态?
感谢您的任何帮助。
如果文件上传需要几分钟,那么uWSGI如何能够
处理其他客户端而不阻塞?
它会阻塞。
解决方案是放置一个网络服务器,例如NGINX
在...前面uWSGI
预缓冲POST
要求。所以文件上传实际上是绑定到 NGINX 处理程序直到完成并且then传递给uWSGI
处理程序。
有什么方法可以使用内置卸载处理
uWSGI 中的功能,以便用户在上传后得到响应
并可以查询处理状态?
您需要创建一个任务队列系统来减轻 Web 处理程序的处理负担。
这是常见的最佳实践。只要环顾四周寻找python task queues
。
对于内置功能,这实际上取决于您需要卸载的任务。
您可以使用内置的uWSGI假脱机程序, 或者uWSGI 骡子。
这些是典型任务队列的非常好的替代方案(例如非常著名的Celery)但有局限性。
只需在您的场景中亲自尝试一下即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)