Python 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

如果我阅读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)
在根urlconf的末尾,我有以下函数调用:

config_logger()
问题是:

  • 这个代码是线程安全的吗

  • django线程之间共享什么类型的变量


  • 除了不使用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“完全防止并发”。有时你需要使用。例如,如果您有一个计数器,该计数器由可以并行触发的视图递增。