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

标签 python django

我尝试在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/

相关文章:

python:array([...]) 是什么意思?

python - 从多对多字段中删除,但不从相关模型中删除

django - 导入错误 : cannot import name _remove_dead_weakref in django virtualenv

javascript - 在 Django 中启用 CORS(跨源请求)

linux - 关于 Linux Mint 17.2 上的 Tkinter python 2.76

python - 具有默认参数和命名空间的模块函数?

python - 如何检查使用 import * 时导入的内容

python - 如何通过在字符串中使用\u 或\U 转义来正确表示 python3 (3.6.1+) 中的补充 unicode 字符

python - 如何在一个 View 中调用多个函数

mysql - 如何在 Django ORM 中使用 GROUP BY