Django与线程安全性
如果我阅读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()
我的问题是:
这段代码是线程安全的吗?
Django的线程之间共享了哪些变量?
1 个回答
1
关于Django模板和它们在多线程方面的问题,其实你能做的事情不多,除了不使用它们,或者至少不使用那些对线程问题敏感的标签。实际上,Django模板标签中只有少数几个会有问题,主要是一些有状态的标签,比如 cycle
。
在你给出的例子中,你并没有考虑线程安全的问题,其实也不需要考虑:只要你正常使用 logging
模块,它本身就是完全线程安全的。正常的使用方式是在需要的模块中调用 logging.getLogger
,并确保在你的 settings.py
中正确设置了 LOGGING
或 LOGGING_CONFIG
,这样就没问题了,不需要想太多。
你可能还会担心在并发更新时数据库的完整性。其实不用担心,如果你使用的是PostgreSQL或MySQL/INNOdb数据库,那么你就完全可以避免并发带来的麻烦。