Django与线程安全性

3 投票
1 回答
3070 浏览
提问于 2025-04-16 07:28

如果我阅读Django的文档,只有关于模板标签的部分提到了线程安全可能带来的风险。

不过,我很好奇在Django中写线程安全的代码时,我需要做些什么或者避免做些什么……

举个例子,我有一个函数用来配置Django中使用的日志记录器。

_LOGGER_CONFIGURED = False

def config_logger():
    global _LOGGER_CONFIGURED
    if _LOGGER_CONFIGURED: return
    _LOGGER_CONFIGURED = True

    rootlogger = logging.getLogger('')
    stderr_handler = StreamHandler(sys.stderr)
    rootlogger.addHandler(stderr_handler)

在我的根URL配置的最后,我有以下的函数调用:

config_logger()

我的问题是:

  1. 这段代码是线程安全的吗?

  2. Django的线程之间共享了哪些变量?

1 个回答

1

关于Django模板和它们在多线程方面的问题,其实你能做的事情不多,除了不使用它们,或者至少不使用那些对线程问题敏感的标签。实际上,Django模板标签中只有少数几个会有问题,主要是一些有状态的标签,比如 cycle

在你给出的例子中,你并没有考虑线程安全的问题,其实也不需要考虑:只要你正常使用 logging 模块,它本身就是完全线程安全的。正常的使用方式是在需要的模块中调用 logging.getLogger,并确保在你的 settings.py 中正确设置了 LOGGINGLOGGING_CONFIG,这样就没问题了,不需要想太多。

你可能还会担心在并发更新时数据库的完整性。其实不用担心,如果你使用的是PostgreSQL或MySQL/INNOdb数据库,那么你就完全可以避免并发带来的麻烦。

撰写回答