【问题标题】:Why is __import__ causing my program to hang?为什么 __import__ 导致我的程序挂起?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 这是我绝对在考虑的事情。
    猜你喜欢
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多