接收器何时在信号中被垃圾收集



我尝试在Django中使用Signal,当我阅读关于方法connect信号的文档时,它有weak参数如下:

weak–Django默认情况下将信号处理程序存储为弱引用。因此,如果您的接收器是本地函数,那么它可能会被垃圾收集。为了防止这种情况,在调用信号的connect((方法时传递weak=False。

我不知道local function什么时候是garbage collected?

一旦不再引用任何Python对象,它都可能被垃圾收集。例如,在该视图运行后。。。

def example_view(request):
def my_callback(*args, **kwargs):
print(args, kwargs)
some_signal.connect(my_callback)
return HttpResponse('')

不再引用my_callback,存储在其中的函数对象可以随时进行垃圾回收。你可以做

all_my_callbacks = []
def example_view(request):
def my_callback(*args, **kwargs):
print(args, kwargs)
some_signal.connect(my_callback)
all_my_callbacks.append(my_callback)
return HttpResponse('')

现在,即使在视图被渲染之后,也有对回调函数对象的引用;它在CCD_ 6中。或者,在具有weak=False:的信号中使用强参考

def example_view(request):
def my_callback(*args, **kwargs):
print(args, kwargs)
some_signal.connect(my_callback, weak=False)
return HttpResponse('')

您可以也应该通过使用顶级函数而不是本地函数来避免所有这些麻烦。几乎所有情况下,这就是代码的外观

def my_callback(*args, **kwargs):
print(args, kwargs)
def example_view(request):
some_signal.connect(my_callback)
return HttpResponse('')

总是有对这样一个函数的引用,所以它永远不会被垃圾回收。

最新更新