python - Django & Celery 使用单例类实例属性作为全局

标签 python scope global-variables

我想这样做:

我在同一个模块(甚至同一个文件)中有 2 个函数:

def a():
    while(True):
         //do something
         if global_var:
              //do something else!

def b():
    global_var = some_function_result

我想到了使用单例类作为全局存储的想法。

(我确实尝试过使用模块级全局并获得相同的结果)

class Singleton(type):
    _instances = {}

    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class MyClass(object):
    __metaclass__ = Singleton

    def __init__(self):
        self.flag = 1

@shared_task
def add_var():
    myclass = MyClass()
    while(1):
        myclass.flag += 1
        print myclass.flag

@shared_task
def print_var():
    myclass = MyClass()
    while(1):
        print myclass.flag

结果:

print_var 一直打印 1 add_var 一直加 1 但它没有反射(reflect)在 print_var 中

编辑:

错过了提早的重要信息: 我在 celery 上运行这些进程——现在我开始明白 celery 和 django 在不同的线程上运行。 但是当我在 celery 中同时运行时,我仍然看不到效果。

最佳答案

如果这就是您想要实现的全部,那么您不需要单例;一个(静态)类属性将完成这项工作:

class MyClass(object):

    FLAG = 1

@shared_task
def add_var():
    myclass = MyClass()
    while(1):
        myclass.FLAG += 1
        print( myclass.FLAG )

@shared_task
def print_var():
    myclass = MyClass()
    while(1):
        print( myclass.FLAG )

关于python - Django & Celery 使用单例类实例属性作为全局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31207697/

相关文章:

python - 如何通过搜索元素的属性在 Python 中使用 ElementTree 删除 xml 中的节点?

python - MSSQL 连接字符串 - 使用另一组凭据的 Windows 身份验证

c++ - 全局静态 bool 指针使用 pthread 导致段错误

javascript - 提示方法不起作用?

javascript - 在函数和对象之外设置变量

android - 从任何地方高效访问全局数据的解决方案

python - 有没有办法不从 Django View 返回响应?

python - 寻找 python 列表中点之间最短距离的更简洁方法?

javascript - 在 Javascript 中更新全局变量时遇到问题

javascript - 查看复杂对象变量 (objectVar.some.other.value) 是否已定义的简单方法