加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – Heroku上的Flask:对于大型POST数据,request.form非常

发布时间:2020-12-16 21:41:47 所属栏目:Python 来源:网络整理
导读:我正在使用带有eventlet工作人员的gunicorn在Heroku上运行Flask应用程序.我的应用程序上的特定路径经常接收POST数据(x-www-form-urlencoded),其中包含一些相当粗糙的字段 – 最多为500KB. 这在本地运行时工作正常,但在Heroku上,对该路由的请求需要5到30秒才
我正在使用带有eventlet工作人员的gunicorn在Heroku上运行Flask应用程序.我的应用程序上的特定路径经常接收POST数据(x-www-form-urlencoded),其中包含一些相当粗糙的字段 – 最多为500KB.

这在本地运行时工作正常,但在Heroku上,对该路由的请求需要5到30秒才能完成 – 几乎100%的时间花在第一次访问request.form上:

t = time.time()
action = str(request.form['action'])
dt = time.time() - t  # Often 10 seconds or more!

Newrelic慢速请求跟踪也证实了这一点.数据库操作在这里或那里有几毫秒,然后在Python代码中花费了大量时间,显然花在等待某些i / o上,因为报告的CPU时间通常小于一毫秒.

我完全无法在本地环境中使用我在生产中使用的相同gunicorn / eventlet设置重现这一点.甚至内置的调试WSGI服务器对这些请求都是闪电般快速的.

有谁知道可能出了什么问题?这是Flask的问题,还是我需要联系Heroku支持的东西?

解决方法

我想我确切地知道发生了什么. TL; DR它在服务器端实际上并不慢,我只是被Newrelic报告的响应时间误导了!

我尝试在@AllanAnderson建议的dotCloud沙箱上运行相同的代码.我首先创建了一个简化的测试用例:一个简单的HTML表单,其中一些隐藏字段预先加载了大约900KB的数据,以及一个除了从request.form字典读取之外什么都不做的视图函数,并测量每次访问所用的时间了time.time().

在Heroku上,结果看起来像这样:

5.87100 seconds: read field "p1": 786432 bytes
0.00019 seconds: read field "p2": 131072 bytes
0.00003 seconds: read field "p3": 12288 bytes
0.00001 seconds: read field "p4": 1024 bytes

在dotCloud上:

0.00096 seconds: read field "p1": 786432 bytes
0.00019 seconds: read field "p2": 131072 bytes
0.00003 seconds: read field "p3": 12288 bytes
0.00001 seconds: read field "p4": 1024 bytes

但是,这两个测试似乎在我的浏览器中占用了相同的时间……到现在为止,你可能已经猜到了这个“问题”的真正答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读