代码之家  ›  专栏  ›  技术社区  ›  Artem Shalagin

用于存储不可变对象的Django全局变量

  •  0
  • Artem Shalagin  · 技术社区  · 6 年前

    我正在试着设置 python-telegram-bot Django webhook模式下的库。应该是这样的:在Django启动时,我对 python电报机器人 并获得 dispatcher 对象作为结果。Django倾听 /telegram_hook url并从电报服务器接收更新。我接下来要做的是将更新传递给 process_update 的方法 调度员 启动时创建。它包含所有解析逻辑,并调用安装过程中指定的回调。

    问题是 调度员 对象需要全局保存。我知道全球各国 恶毒的 但这不是一个真正的全球国家,因为 调度员 是不可变的。然而,我仍然不知道应该把它放在哪里,也不知道如何确保在安装阶段完成后,它对所有线程都是可见的。所以问题是如何正确保存 调度员 安装后,从Django的 viewset ?

    另外,我知道我可以使用内置的网络服务器,或者使用轮询或其他方式。然而,我有理由使用Django,我无论如何都想知道如何处理这样的情况,因为当我需要全局存储启动时创建的不可变对象时,这不是我能想象的唯一情况。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Sardorbek Imomaliev    6 年前

    看起来您需要这样的线程安全单例 https://gist.github.com/werediver/4396488 http://alacret.blogspot.ru/2015/04/python-thread-safe-singleton-pattern.html

    import threading
    
    # Based on tornado.ioloop.IOLoop.instance() approach.
    # See https://github.com/facebook/tornado
    class SingletonMixin(object):
        __singleton_lock = threading.Lock()
        __singleton_instance = None
    
        @classmethod
        def instance(cls):
            if not cls.__singleton_instance:
                with cls.__singleton_lock:
                    if not cls.__singleton_instance:
                        cls.__singleton_instance = super(SingletonMixin, cls).__new__(cls)
            return cls.__singleton_instance