我尝试在Django中使用signal,当我阅读关于方法connect信号的文档时,它有如下的weak参数:
默认情况下,
弱- Django将信号处理程序存储为弱引用。因此,如果您的接收器是一个本地函数,则可能会被垃圾收集。为了防止这种情况,在调用信号的connect()方法时传递weak=False。
我不知道local function什么时候成为garbage collected?
发布于 2019-11-01 08:07:00
一旦不再有对Python对象的引用,任何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('')现在,即使在呈现视图之后也有对回调函数对象的引用;它在all_my_callbacks中。或者,使用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('')总是有对这样一个函数的引用,所以它从来不是垃圾收集的。
https://stackoverflow.com/questions/58655595
复制相似问题