【发布时间】:2014-06-03 21:33:55
【问题描述】:
我正在开发一个使用默认 python 日志系统的 python 应用程序。该系统的一部分是能够在日志配置文件中定义处理程序。此应用程序的处理程序之一是 django 管理电子邮件处理程序,“django.utils.log.AdminEmailHandler”。当应用程序初始化日志系统时,它会调用 logging.config.fileconfig。这是在后台线程上完成的,并尝试定期重新加载配置文件。我相信这很重要。
我已经通过python日志源代码追踪到方法:
def _resolve(name):
"""Resolve a dotted name to a global object."""
name = name.split('.')
used = name.pop(0)
found = __import__(used)
for n in name:
used = used + '.' + n
try:
found = getattr(found, n)
except AttributeError:
__import__(used)
found = getattr(found, n)
return found
在 python2.7/logging/config.py 文件中
当此函数被赋予参数“django.utils.log.AdminEmailHandler”以创建该处理程序时,我的应用程序将挂起该命令
__import__(used)
这里使用的是“django”。
我做了一些研究,我看到一些提到 __import__ 不是线程安全的,并避免在后台线程中使用它。这是准确的吗?并且知道 __import__("django") 确实会导致死锁,我能做些什么来防止它吗?
【问题讨论】:
标签: python django multithreading logging deadlock