【问题标题】:Global variable with django and celery使用 django 和 celery 的全局变量
【发布时间】:2013-08-27 12:49:32
【问题描述】:

我有这样的代码,

wl_data = {}

def set_wl_data():
    global wl_data
    wl_data = get_watchlist_data()


def get_wl_data(scripcodes):
    # Filtering Data
    result = {scripcode:detail for scripcode, detail in wl_data.iteritems() if int(scripcode) in scripcodes or scripcode in scripcodes}
    return result

我将其作为 django 项目运行, 我正在从 celery 调用 setter 方法,以更新全局变量 wl_data。
sweetpie api会调用getter方法get_wl_data来获取全局变量wl_data。

问题是 celery 正在正确更新 wl_data。 但是当我们在浏览器中点击tastepie api url时,getter方法 提供旧数据。

栈溢出的相关问题很多,这里的区别在于setter方法是由celery task调用的。请帮我解决这个问题。

【问题讨论】:

    标签: python django celery django-celery


    【解决方案1】:

    如果您在 Django 项目中对全局变量进行任何操作,那么您做错了。在这种情况下,Celery 和 Django 运行在完全独立的进程中,因此无法共享数据。您需要让 Celery 将该数据存储在某处 - 在数据库中或文件中 - 以便 Django 可以获取并提供它。

    【讨论】:

    • 谢谢@daniel-roseman。我使用 MongoDB 作为后端。我应该使用 memchaced 或 redis 之类的内存存储还是使用 Mongodb 本身来存储来自 celery 的数据。
    • 这些都可以。不过,最好使用已经设置好的 MongoDB。
    • @DanielRoseman 必须有一种方法来获取文件。如果你想自动化一切,全局变量在普通集群中是必须的。应用程序不得包含任何密码。 12factor.net
    猜你喜欢
    • 2012-09-30
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2011-01-14
    相关资源
    最近更新 更多