Django全局变量来存储不可变对象

时间:2018-05-15 15:37:55

标签: django concurrency webhooks telegram-bot python-telegram-bot

我正在尝试使用Django在webhook模式下设置python-telegram-bot库。这应该如下工作:在Django启动时,我做了python-telegram-bot的初始设置,并得到一个dispatcher对象作为结果。 Django侦听/telegram_hook url并从Telegram服务器接收更新。我接下来要做的是将更新传递给在启动时创建的process_update的{​​{1}}方法。它包含所有解析逻辑并调用在安装过程中指定的回调。

问题是需要全局保存dispatcher对象。我知道全局状态是邪恶,但这并不是真正的全局状态,因为dispatcher是不可变的。但是,我仍然不知道在何处放置它以及如何确保在设置阶段完成后所有线程都可以看到它。所以问题是如何在设置之后正确保存dispatcher以从Django的dispatcher调用它?

P.S。我知道我可以使用内置的Web服务器或使用轮询或其他任何东西。但是,我有理由使用Django而且我还是想知道如何处理这样的情况,因为当我需要存储在全局启动时创建的不可变对象时,这不是我能想到的唯一情况。

1 个答案:

答案 0 :(得分:1)

看起来你需要像这样的线程安全单例https://gist.github.com/werediver/4396488http://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