当前位置: 首页 > 知识库问答 >
问题:

python3.x - what is python dangling circular ref?

薛泰
2023-11-24

下面是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
这里有什么必要这样操作?
这和迷途指针有什么关系吗?

共有3个答案

潘秦斩
2023-11-24
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,即解除引用。
从而避免后续可能出现的循环引用。

潘文乐
2023-11-24

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

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

樊运乾
2023-11-24

我不怎么写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"的含义
 类似资料:
  • 以下Python3.x整数乘法的平均运算时间在1.66s到1.77s之间: 如果将替换为,则需要在和之间。怎么会呢? 另一方面,在Java中则相反:在Java中更快。Java测试链接:为什么在Java中2*(i*i)比2*i*i快? 我运行每个版本的程序10次,以下是结果。

  • 本文向大家介绍python面试题Python2.x和Python3.x的区别,包括了python面试题Python2.x和Python3.x的区别的使用技巧和注意事项,需要的朋友参考一下 下面看下python2.x和python3.x的区别 1.大环境不同   python2.x:源码重复,不规范   python3.x:整合源码,更清晰优美简单  2.默认编码不同   python2.x:默认编

  • 问题内容: 对于我的应用程序,我需要设置一些小部件参数,例如alignment()和其他。但是我无法导入它们(其他PyQt5素材导入没有任何问题)。 使用此代码 我收到以下错误: 并使用此作品: 尽管我有一个可行的解决方案,但我只想导入而不能。另外,为什么不一起工作? 问题答案: 我认为这里的困惑在于PyQt有一个称为的特殊虚拟模块,该模块将 所有内容 导入单个名称空间。这是一个非常有用的功能,但

  • 本文向大家介绍Python3.x中自定义比较函数,包括了Python3.x中自定义比较函数的使用技巧和注意事项,需要的朋友参考一下 在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢? 以min函数的定义为例,有两种重载形式: 单参数(一个迭代器): 多参数(多个待比较内容): 本文主要讨论key=func参数的使用 。举例说明吧

  • 我在查看sorted_containers的源代码时,惊讶地看到了这一行: 这里的是一个整数。为什么在一个地方使用位移位,而在另一个地方使用乘法?位移位可能比整数除以2快,这似乎是合理的,但为什么不把乘法也换成移位呢?我对以下案例进行了基准测试: (乘以,除法) (shift,shift) (次数,移位) (移位、除法) 以上是问题的原话。丹·盖茨在他的回答中提供了一个极好的解释。 为了完整起见,

  • 我需要依次调用三次subprocess. 发现最后一个没有执行? 在流媒体服务器的控制台上只能看到: aac和mp4的rtmp信息, 看不到live的rtmp连接 参考代码: 问题1:这三个是串行执行的. 如何让他们异步执行 问题2: 上面的示例串行执行, 为什么 mergeVAP没有执行.在命令行上执行是可以执行的