what is python dangling circular ref?

下面是wsgi web server的片段demo

def start_response(status, response_headers, exc_info=None):
        if exc_info:
            try:
                if headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[1].with_traceback(exc_info[2])
            finally:
                exc_info = None  # avoid dangling circular ref
        elif headers_set:
            raise AssertionError("Headers already set!")

        headers_set[:] = [status, response_headers]

        # Note: error checking on the headers should happen here,
        # *after* the headers are set.  That way, if an error
        # occurs, start_response can only be re-called with
        # exc_info set.

        return write

我想问:
exc_info = None # avoid dangling circular ref
这里有什么必要这样操作?
这和迷途指针有什么关系吗?

阅读 715
3 个回答

我不怎么写python,但我觉得copilot chat讲得还可以:

这段代码是Python的WSGI(Web Server Gateway Interface)应用程序的一部分。start_response函数是WSGI应用程序的核心部分,它用于设置HTTP响应的状态和头部。 "avoid dangling circular ref"这句注释是指避免形成悬空的循环引用。在Python中,循环引用是指两个或更多的对象互相引用,形成一个闭环。这可能会导致内存泄漏,因为Python的垃圾收集器无法回收这些对象。 在这段代码中,exc_info是一个包含异常类型、异常值和追踪信息的元组。如果exc_info在函数结束时仍然引用这些对象,那么这些对象就不能被垃圾收集器回收,因为exc_info是一个全局变量,它的生命周期比这些对象长。为了避免这种情况,代码在finally块中将exc_info设置为None,断开了对这些对象的引用,使得它们可以被垃圾收集器回收。这就是"avoid dangling circular ref"的含义

这和迷途指针有什么关系吗?—— 没有半毛钱关系

exc_info 是存放报错信息的,而报错是天生不存在,是后天才会产生,所以 exc_info=None 是天经地义的事情

To be able to deal with errors, you need to know that the start_response() callable you have been using throughout this chapter takes an optional third parameter named exc_info, which defaults to None.

exc_info是在调用start_response之前就产生的错误异常。
在处理完exc_info指向的异常后,将exc_info置为None,即解除引用。
从而避免后续可能出现的循环引用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏