【问题标题】:Django global variable to store immutable objectDjango全局变量存储不可变对象
【发布时间】:2018-05-15 15:37:54
【问题描述】:

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

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

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

【问题讨论】:

  • 我的回答有帮助吗?

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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2014-02-24
    • 2019-08-26
    • 2013-05-06
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多