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

时间:2015-07-03 13:10:51

标签: 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,但不反映在print_var

编辑:

错过提及更早的重要信息: 我在芹菜上运行这些过程 - 现在我已经明白芹菜和django在不同的线程上运行。 但是当我在芹菜中运行时,我仍然没有看到效果。

1 个答案:

答案 0 :(得分:4)

如果这就是你想要达到的目的,那你就不需要单身;一个(静态)类属性将完成这项工作:

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 )