Python 3.7 上的 Flask 比具有 Google App Engine 标准环境的 Python 2.7 上的 webapp2 要求更高(也更昂贵)

Posted

技术标签:

【中文标题】Python 3.7 上的 Flask 比具有 Google App Engine 标准环境的 Python 2.7 上的 webapp2 要求更高(也更昂贵)【英文标题】:Flask on Python 3.7 more demanding (and expensive) than webapp2 on Python 2.7 with Google App Engine Standard environment 【发布时间】:2020-08-29 15:07:54 【问题描述】:

我最近将 [python 2.7 / webapp2] 中内置的一个非常简单的项目移植到 [python 3.7 / Flask] 中,在上个月我看到 成本从 0 美元提高到 20 美元

该项目非常简单(90 行代码):只是几个请求处理程序,它们根据查询字符串中传递的值返回不同的 json。除了语法略有不同外,代码几乎没有区别。流量和请求也没有太大变化,如果有什么变化的话。

在计费中,我可以看到前端工作时间如何显着增加,以及 GAE 如何比以前更频繁地启动更多实例。

有没有人经历过同样的行为? python 3.7 和 Flask 在 2.7 上是否比 webapp2“重”?

为了完整起见,两个版本都部署了标准原版gcloud app deploy,没有其他选项。它在 F1 实例上使用标准环境,没有后台工作人员或任务。 app.yaml 在与实例设置相关的部分几乎相同:

env: standard
instance_class: F1
automatic_scaling:
  min_idle_instances: automatic
  max_idle_instances: automatic
  min_pending_latency: automatic
  max_pending_latency: automatic

没有流量的版本,没有任何实例正在运行(它们无法停止,因此它们正在服务,但有 0 个实例)。

为了清楚起见,我可以附上新版本的图表,以及我暂时重新启用的旧版本。从图中可以清楚地看出,新设置如何无缘无故地启动实例,而旧设置如何保持一个很酷的平面 1 实例处于活动状态。

【问题讨论】:

经过进一步调查,我可以确认,与带有 webapp2 的 Python 2.7 相比,带有 Flask 的 Python 3.7 运行时的占用空间肯定更大。同一脚本的执行延迟在第 50/90/95 个百分位从平均 5ms/50ms/90ms 跃升至 15ms/90ms/120ms。这平均是 2 倍的增长,这很可能会触发 Google App Engine 调度程序启动额外的实例。 【参考方案1】:

您可能熟悉,App Engine 定价主要基于实例运行的小时数。 https://cloud.google.com/appengine/pricing

Flask 或 python37 运行时并没有什么特别之处,会导致它比 python27 webapp2 应用程序运行“更重”。但是,使用模式可能会导致这样的计费行为。例如:

如果旧版本(在您的情况下是 python27 应用程序)被禁用并且扩展类型允许实例继续在旧版本上运行,您将支付两个版本的计算时间。 使用传入的 HTTP 请求触发后台工作(例如数据处理、媒体压缩等)并在工作完成之前返回会导致计算时间长,从而导致费用高昂。

这里探讨了其他可能性:https://***.com/a/47245172/11957811。为了确定在您的特定情况下导致确切费用的原因,我们需要知道您如何部署新旧应用程序(例如您运行了哪些 gcloud 命令和标志)以及两者的 app.yaml 配置是什么.

【讨论】:

谢谢约书亚!我更新了我的原始问题以提供有关设置的更多详细信息。我还检查了您提到的其他讨论,但它指的是 Flex 环境,其行为与我使用的标准环境不同。您如何看待上面的图表?

以上是关于Python 3.7 上的 Flask 比具有 Google App Engine 标准环境的 Python 2.7 上的 webapp2 要求更高(也更昂贵)的主要内容,如果未能解决你的问题,请参考以下文章

Anaconda 总是安装 Python 3.7

加载 MySQLdb 模块时出错 - Windows 上的 Python 3.7

python版本升级到3.7

Windows 7(64 位)上的 Python 3.7 64 位:CSV - 字段大于字段限制(131072)[重复]

Flask实现websocket

需要 Python 3.7 中的 Mysql 查询以从具有列 (table_no, is_new) 的表中选择记录