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



我想做这件事:

我在同一个模块中有两个功能(甚至是同一个文件(:

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

有人给了我使用singleton类作为全局存储的想法。

(我确实尝试使用模块级全局,结果相同(

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是在不同的线程上运行的。但当我把两者都放在芹菜里时,我仍然看不到效果。

如果这就是您想要实现的全部,则不需要singleton;一个(静态(类属性可以完成任务:

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 )

相关内容

  • 没有找到相关文章

最新更新