为什么__import__导致我的程序挂起?

时间:2014-06-03 21:33:56

标签: python django multithreading logging deadlock

我正在使用一个使用默认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

当给出此函数时,参数#d; django.utils.log.AdminEmailHandler"为了创建该处理程序,我的应用程序挂起了命令

__import__(used)

使用的是" django"。

我做了一些研究,我看到一些提及__import__不是线程安全的,并且避免在后台线程中使用它。这准确吗?并且知道__import __(" django")确实会导致死锁,我有什么办法可以阻止它吗?

1 个答案:

答案 0 :(得分:1)

我建议使用默认的Django LOGGING设置来控制日志记录。对于开发,如果更改了任何文件,则使用manage.py runserver启动服务器将自动重新加载Django,包括具有日志记录配置的设置文件。在实践中它运作得很好!

https://docs.djangoproject.com/en/dev/topics/logging/#examples