Python Django与线程安全
如果我阅读django文档,只有关于模板标记的文档提到线程安全的潜在危险 然而,我很好奇,要在Django中编写线程安全代码,我必须做/避免哪些事情 一个例子是,我有以下函数来配置django中使用的记录器Python Django与线程安全,python,django,thread-safety,Python,Django,Thread Safety,如果我阅读django文档,只有关于模板标记的文档提到线程安全的潜在危险 然而,我很好奇,要在Django中编写线程安全代码,我必须做/避免哪些事情 一个例子是,我有以下函数来配置django中使用的记录器 _LOGGER_CONFIGURED = False def config_logger(): global _LOGGER_CONFIGURED if _LOGGER_CONFIGURED: return _LOGGER_CONFIGURED = True
_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)
在根urlconf的末尾,我有以下函数调用:
config_logger()
问题是:
除了不使用django模板或至少不使用对线程问题敏感的标记之外,对于django模板及其线程问题,您真的没有什么可以做的。没有多少django模板标记存在问题,只有有状态的标记存在问题,例如
cycle
在您给出的示例中,您没有做任何关于线程安全的事情,而且无论如何也不应该这样做:logging
模块已经是完全线程安全的,只要您以正常方式使用它,也就是在需要它的模块中调用logging.getLogger
,而LOGGING
或LOGGING\u CONFIG
在settings.py
中。没必要在这方面很聪明
您可能关心的其他事项是在并发更新面前的数据库完整性。不要担心,如果您使用的是PostgreSQL或MySQL/INNOdb数据库,那么您完全可以避免并发问题。您的意思是线程不安全的潜在危险:我认为存在线程不安全的潜在场所(其中一些是人指出的)-urlresolver使用全局可变字典,如果在服务器启动时发生并发请求,则此对象可以处于不确定状态-许多django表单和字段类都有全局计数器。。。我不知道它们是如何使用的,但对它们的访问似乎不受互斥锁的保护。我想这可能有潜在的危险。我知道日志和日志配置,但我使用的是django 1.2.3。我想问题是:我不知道django中哪些是全局变量,哪些不是全局变量。。。对我来说唯一显而易见的是请求处理程序中的
request
变量。但是,如果您只有variable inside views.py,那么它在所有线程中都是全局的吗?这个注释似乎有点笼统:“您可能关心的其他事情是数据库完整性。[…]不要担心。”当然,托管DBMS可能会处理所有并发问题,但我使用PyODBC作为Django数据库访问,PyODBC明确指出,您可以从多个线程使用同一个模块,但不能使用同一个“连接”对象。除了讨论Django代码之外,有人能告诉我Django是否正确地处理了这个——以及类似的——DB问题吗?@Dan H:一般来说,对于大多数数据库客户端来说,数据库连接都不是线程安全的。我不会说MySQL“完全防止并发”。有时你需要使用。例如,如果您有一个计数器,该计数器由可以并行触发的视图递增。