首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当接收者在信号中被垃圾收集?

当接收者在信号中被垃圾收集?
EN

Stack Overflow用户
提问于 2019-11-01 07:26:01
回答 1查看 129关注 0票数 3

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

默认情况下,

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-01 08:07:00

一旦不再有对Python对象的引用,任何Python对象都可能被垃圾回收。例如,在这个视图运行之后..。

代码语言:javascript
复制
def example_view(request):
    def my_callback(*args, **kwargs):
        print(args, kwargs)
    some_signal.connect(my_callback)
    return HttpResponse('')

..。不再有对my_callback的引用,存储在其中的函数对象可以在任何时候被垃圾收集。你可以

代码语言:javascript
复制
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在信号中使用强引用。

代码语言:javascript
复制
def example_view(request):
    def my_callback(*args, **kwargs):
        print(args, kwargs)
    some_signal.connect(my_callback, weak=False)
    return HttpResponse('')

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

代码语言:javascript
复制
def my_callback(*args, **kwargs):
    print(args, kwargs)

def example_view(request):
    some_signal.connect(my_callback)
    return HttpResponse('')

总是有对这样一个函数的引用,所以它从来不是垃圾收集的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58655595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档