如何在Python中强制执行垃圾收集的顺序?

如何在Python中强制执行垃圾收集的顺序?,python,garbage-collection,Python,Garbage Collection,在Python中,我不理解垃圾收集的顺序 让我们以两个对象为例:上下文和任务。任务保留对上下文的引用。我原以为任务会先被删除,但我错了 您可以通过以下代码看到这一点: 导入gc 类上下文: 定义初始化(自): self.ptr=2 定义(自我): 打印(“删除上下文(ctx引用:%d)”%len(gc.get\u引用者(self))) 课堂任务: 定义初始化(自身,ctx): self.ctx=ctx 定义(自我): 打印(self.ctx.ptr) 打印(“删除任务(ctx引用:%d)”%le

在Python中,我不理解垃圾收集的顺序

让我们以两个对象为例:上下文和任务。任务保留对上下文的引用。我原以为任务会先被删除,但我错了

您可以通过以下代码看到这一点:

导入gc
类上下文:
定义初始化(自):
self.ptr=2
定义(自我):
打印(“删除上下文(ctx引用:%d)”%len(gc.get\u引用者(self)))
课堂任务:
定义初始化(自身,ctx):
self.ctx=ctx
定义(自我):
打印(self.ctx.ptr)
打印(“删除任务(ctx引用:%d)”%len(gc.get\u引用器(self.ctx)))
ctx=Context()
t1=任务(ctx)
t2=任务(ctx)
打印(“ctx引用:%d”%len(gc.get\u引用器(ctx)))
这将产生以下输出:

ctx refs: 3
remove context (ctx refs: 2)
2
remove task (ctx refs: 0)
2
remove task (ctx refs: 0) 
为什么引用不首先强制任务的垃圾收集?如何首先强制对上下文进行垃圾收集


如何解释引用的数量?

您的代码示例不完整,因为您没有说明如何实际删除对象。此外,我认为您的示例不一定与垃圾收集有任何关系——当对象的引用计数为零时,垃圾收集器不负责删除对象——这只是自动发生的。当存在引用循环时,垃圾收集器就开始工作了,这样一些对象的引用计数就永远不会降到零(因此它们成为垃圾)。之所以
gc.get\u referers()
有效,是因为垃圾收集器会跟踪大多数(尽管不是全部)对象,以防它们成为引用周期的一部分。当程序退出时,对象会被释放。这是我想要控制的,但这并不能回答我的问题。您是如何获得上述输出的?不清楚,;我不知道在删除两个
任务之前,如何使
上下文
对象的
\uu del\uu
发生。请把剩下的代码贴出来。更一般地说,你真正想要完成的是什么?试图精细地控制Python中对象的释放方式可能表明您没有以最佳方式进行操作,因为很少有任何理由这样做;我想我明白你的意思了。您的意思是,这是您退出解释器时得到的输出。也就是说,我不认为你能轻易地控制它;当然不是从纯Python级别。解释器在关机时的确切操作顺序是复杂的,很难控制。它倾向于将引用计数强制设置为零之类的事情。这就是为什么
\uuu del\uuu
很危险的部分原因——在调用对象时,可以假设对象所在模块的其余部分处于稳定状态。