Django和线程安全性

3
如果我阅读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()

问题是:
  1. 这段代码是否线程安全?

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


你是指线程不安全的潜在危险吧 :p - Edmund
我认为有一些潜在的线程不安全的地方(其中一些是由人指出的)。-urlresolver使用全局可变字典,如果在服务器启动时发生并发请求,则该对象可能处于不确定状态。 -许多Django表单和字段类具有全局计数器...我不知道它们如何使用,但似乎没有受到互斥锁保护的访问。我想这可能是潜在的危险。 - Jeeyoung Kim
1个回答

1

关于Django的模板和其与线程的问题,你真的无法做很多事情,除非你不使用它们,或者至少不使用对线程问题敏感的标签。并没有很多Django模板标签会出现问题,只有那些有状态的标签才会,比如cycle

在你提供的示例中,你没有处理线程安全性,并且你也不应该这样做:logging模块已经完全支持线程安全,只要你以正常方式使用它,即在需要的模块中调用logging.getLogger,而LOGGINGLOGGING_CONFIG在你的settings.py文件中适当地设置。不需要对此进行复杂的操作。

你可能还担心的其他事情是在同时更新时数据库完整性的问题。如果你正在使用PostgreSQL或MySQL/INNOdb数据库,那么你将完全受到并发保护。


我知道 LOGGING 和 LOGGING_CONFIG,但我正在使用 Django 1.2.3。 - Jeeyoung Kim
我猜问题是:我不知道在Django中哪些变量是全局变量,哪些不是...唯一显而易见的是请求处理程序中的request变量。但是,如果你只是在views.py中有一个变量,那么它是否在所有线程中都是全局的? - Jeeyoung Kim
1
这个评论似乎有点笼统:“其他你可能关心的是数据库完整性。[...]不用担心。” 当然,托管的DBMS可能处理所有并发问题,但我正在使用PyODBC作为我的Django数据库访问,而PyODBC明确声明您可以从多个线程使用相同的模块,但不能使用相同的“连接”对象。 除了在Django代码中四处搜索之外,有人能告诉我Django是否正确处理了这个 - 和类似的 - 数据库问题吗? - Dan H
@Dan H:我不介意在Django代码库中闲逛。一般来说,对于大多数数据库客户端而言,数据库连接并不是线程安全的。 - SingleNegationElimination
我不会说使用MySQL就可以“完全保护并发”。有时候你需要使用select for update。例如,如果你有一个计数器,它由一个视图递增,而这个视图可能会被并行触发。 - Mark Chackerian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接