Flask get请求返回不一致

时间:2016-11-20 20:44:42

标签: python heroku web flask server

我使用flask在heroku上构建一个迷你服务器。服务器端代码如下所示:

    from flask import Flask
    from flask_cors import CORS, cross_origin

    app = Flask(__name__)

    schedule = {'Basketball': 'old value'}

    @app.route("/")
    @cross_origin()
    def get_all_schedule():
        return json.dumps(schedule)

    @app.route("/update", method=['post'])
    def update_basketball_schedule():
          globle schedule
          schedule['Basketball'] = 'new value'

    if __name__ == "__main__":
        app.run(host='0.0.0.0')

我有一个全球词典“时间表”来存储时间表数据。我使用post url来更新这个时间表,并使用“/”url来获取数据,看起来非常简单。

我正在Chrome浏览器上测试此应用程序。我把帖子的网址叫了一次。然后当我调用“/”时,有时它会返回带有“new value”的字典,有时它会返回带有“old value”的字典。这种行为的原因是什么?

我在heroku上使用免费的dyno。 在我的Procfile中:

     web: gunicorn server:app

2 个答案:

答案 0 :(得分:1)

Heroku dynos偶尔会重置,死亡或被禁用。因此,存储在内存中的所有变量的值都将丢失。要解决此问题,您可以使用redis或其他键/值存储来保存数据。

答案 1 :(得分:1)

<块引用>

我有一个全局字典 schedule 来存储日程数据

你不能像这样依赖变量来维持状态。

对于初学者来说,Gunicorn will run with multiple processes by default

<块引用>

Gunicorn 在每个 dyno 中分叉多个系统进程,以允许 Python 应用程序支持多个并发请求,而不要求它们是线程安全的。在 Gunicorn 术语中,这些被称为工作进程(不要与 Heroku 工作进程混淆,后者在自己的 dynos 中运行)。

每个分叉的系统进程都会消耗额外的内存。这限制了您可以在单个 dyno 中运行的进程数。对于典型的 Django 应用程序内存占用,您可以期望在 freehobbystandard-1x dyno 上运行 2-4 个 Gunicorn 工作进程。您的应用程序可能允许对此进行更改,具体取决于您应用程序的特定内存要求。

我们建议为此设置设置一个配置变量。 Gunicorn 会自动遵守 WEB_CONCURRENCY 环境变量(如果已设置)。

heroku config:set WEB_CONCURRENCY=3

WEB_CONCURRENCY 环境变量由 Heroku 根据进程的 Dyno 大小自动设置。此功能旨在成为您的应用程序的合理起点。我们建议您了解进程的内存要求并相应地设置此配置变量。

您提出的每个请求都可以由任何 Gunicorn 工作人员处理。由于各种原因,将 WEB_CONCURRENCY 设置为 1 并不是正确的解决方案。例如,as Jake saysHeroku dynos restart frequently(每天至少一次)并且您的状态也会丢失。

幸运的是,Heroku 提供了 a number of data store addons,包括可能非常适合这里的 Redis 等内存存储。这将使您可以在所有 Gunicorn 工作人员和跨 dyno 重启之间共享状态。如果您需要以这种方式扩展应用程序,它甚至可以跨 dynos 工作。