Когда получатель был мусор в сигнале? - PullRequest
1 голос
/ 01 ноября 2019

Я пытаюсь использовать сигнал в Django, когда я читаю документ о методе connect signal, он имеет параметр weak следующим образом:

слабый - Django хранит обработчики сигналов как слабые ссылкипо умолчанию. Таким образом, если ваш приемник является локальной функцией, он может быть сборщиком мусора. Чтобы предотвратить это, передайте слабый = False при вызове метода connect () сигнала.

Я не знаю, когда local function было garbage collected?

1 Ответ

0 голосов
/ 01 ноября 2019

Любой объект 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('')

Всегда есть ссылка на такую ​​функцию, поэтому она никогда не собирается сборщиком мусора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...