我尝试在Django中使用Signal,当我阅读有关方法connect
信号的文档时,它有weak
参数如下:
weak – Django stores signal handlers as weak references by default. Thus, if your receiver is a local function, it may be garbage collected. To prevent this, pass weak=False when you call the signal’s connect() method.
我不知道本地函数
何时被垃圾收集?
最佳答案
一旦没有更多的引用,任何 Python 对象都可能被垃圾回收。例如,此 View 运行后...
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('')
现在,即使在渲染 View 之后,也存在对回调函数对象的引用;它位于 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('')
始终存在对此类函数的引用,因此它永远不会被垃圾收集。
关于python - 接收器何时在信号中被垃圾收集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58655595/