【问题标题】:Does Flask or Heroku fail to keep track of global variables well? [duplicate]Flask 或 Heroku 是否无法很好地跟踪全局变量? [复制]
【发布时间】:2020-06-19 21:26:11
【问题描述】:

我在一个 Heroku 服务器上设置了一个聊天机器人,该服务器在 gunicorn 框架上运行 Python 3.8 中的 Flask。除了一个全局变量外,一切都运行良好。以下是我与此问题相关的代码;我在 python 方面不是很有经验,所以这可能是我忽略的一个简单错误。

import os
import sys
import json
from flask import Flask, request
import requests
from random import randint
import datetime

...

@app.route('/spam', endpoint = 'spam', methods=['POST'])
def webhook():
    log('The Talker Log: Received a ping to the /spam endpoint.')
    global spam_message_count
    spam_message_count += 1 
    if spam_message_count == 1:
        post_message('The Talker', 'SPAM HAS BEEN ACTIVATED. Message #1', '')
    else:
        post_message('The Talker', 'SPAM Message #{}'.format(spam_message_count), '')
    return "ok", 200

(其他方法未显示)此代码没有任何价值,实际上只是以后的测试。

为此设置包括一台单独的机器,该机器使用 cron 每分钟 ping /spam 端点。设置完成后,我会收到来自聊天机器人的以下消息:

SPAM HAS BEEN ACTIVATED. Message #1

一分钟后

SPAM HAS BEEN ACTIVATED. Message #1

一分钟后

SPAM Message #2

一分钟后

SPAM Message #3

一分钟后

SPAM Message #4

一分钟后

SPAM Message #5

一分钟后

SPAM Message #2

一分钟后

SPAM Message #3

一分钟后

SPAM Message #4

一分钟后

SPAM Message #6

让它运行了大约四十分钟后,它只在 #22 结束。我真的不确定变量在哪里被绊倒,任何帮助将不胜感激。

【问题讨论】:

  • 也许你应该把它保存在文件或数据库中。这个变量可以在一个线程中是全局的,但服务器可能使用许多线程/进程,然后其他进程有自己的变量spam_message_count

标签: python flask heroku gunicorn chatbot


【解决方案1】:

Heroku Dynos 运行您的应用的容器化版本,并且不保证您的应用会持续运行。 Dynos 会不时透明地重新启动,免费帐户将在 30 分钟无活动后关闭 dyno - 只有在请求进入时才会再次重新启动。这意味着您不能将应用程序的状态存储在应用程序本身中, a.k.a. 全局变量,您打算超越单个请求。

您最好的选择可能是在数据存储中的请求之间保存您希望保存的任何状态。在您的情况下,您可以考虑Redis

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 2015-04-15
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多