python - 可以防止调用“__del__()”的“参考循环”示例?
问题描述
(我正在使用 Python 3.6.5
)
我正在调试一个似乎是由于__del__
没有被调用引起的生产问题。__init_
我在两者中都添加了调试消息,__del__
结果有时(遇到产品问题时)__del__
没有被调用。
我用谷歌搜索了很多,根据我的理解,有两种情况__del__
可能不会被调用:
os._exit()
- 循环参考(或参考循环)
我很确定我们没有打电话os._exit()
,所以我怀疑这个问题很可能是由一些参考循环引起的,但我没有弄清楚参考循环会是什么样子。那么有人可以帮助举一个可以防止被调用的参考循环的例子吗?__del__
解决方案
似乎评论中提到的PEP 0442 (Python 3.4) 不适用于所有场景。刚刚从这里找到了一个例子(用 Python 3.5.3测试):
[STEP 101] # cat ref_loop.py
class Foo():
def __init__(self):
print("now in __init__")
self.foo = self
def __del__(self):
print("now in __del__")
foo = Foo()
exit()
[STEP 102] # python3 ref_loop.py
now in __init__
[STEP 103] # python3 --version
Python 3.5.3
[STEP 104] #
我的另一个 Python 3.6.5也可以重现它。
请注意,如果exit()
删除了 then__del__()
将被调用,尽管我不明白为什么。
推荐阅读
- ruby-on-rails - 无法在 ruby on rails 5.0 模型中使用活动记录时间方法
- r - 如何在 r 中为波士顿数据集创建图形
- php - 修改upload_max_filesize php.ini 不起作用
- angularjs - 如何缩小 angularjs+bootstrap4 项目
- linux - 使用 awk 搜索模式并从日志文件中打印接下来的 15 行
- apache - Ubuntu apache无法启动权限被拒绝
- ios - Iphone X 的纵横比问题
- docker - 将环境变量传递给在 kubernetes 中运行的 docker
- laravel - Laravel - 将自定义数据传递给电子邮件视图
- sql - Oracle 使用 dblink 从远程表调整插入