我使用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
答案 0 :(得分:1)
Heroku dynos偶尔会重置,死亡或被禁用。因此,存储在内存中的所有变量的值都将丢失。要解决此问题,您可以使用redis或其他键/值存储来保存数据。
答案 1 :(得分:1)
我有一个全局字典 schedule
来存储日程数据
你不能像这样依赖变量来维持状态。
对于初学者来说,Gunicorn will run with multiple processes by default:
<块引用>Gunicorn 在每个 dyno 中分叉多个系统进程,以允许 Python 应用程序支持多个并发请求,而不要求它们是线程安全的。在 Gunicorn 术语中,这些被称为工作进程(不要与 Heroku 工作进程混淆,后者在自己的 dynos 中运行)。
每个分叉的系统进程都会消耗额外的内存。这限制了您可以在单个 dyno 中运行的进程数。对于典型的 Django 应用程序内存占用,您可以期望在 free
、hobby
或 standard-1x
dyno 上运行 2-4 个 Gunicorn 工作进程。您的应用程序可能允许对此进行更改,具体取决于您应用程序的特定内存要求。
我们建议为此设置设置一个配置变量。 Gunicorn 会自动遵守 WEB_CONCURRENCY
环境变量(如果已设置)。
heroku config:set WEB_CONCURRENCY=3
WEB_CONCURRENCY
环境变量由 Heroku 根据进程的 Dyno 大小自动设置。此功能旨在成为您的应用程序的合理起点。我们建议您了解进程的内存要求并相应地设置此配置变量。
您提出的每个请求都可以由任何 Gunicorn 工作人员处理。由于各种原因,将 WEB_CONCURRENCY
设置为 1
并不是正确的解决方案。例如,as Jake says、Heroku dynos restart frequently(每天至少一次)并且您的状态也会丢失。
幸运的是,Heroku 提供了 a number of data store addons,包括可能非常适合这里的 Redis 等内存存储。这将使您可以在所有 Gunicorn 工作人员和跨 dyno 重启之间共享状态。如果您需要以这种方式扩展应用程序,它甚至可以跨 dynos 工作。