Какой объем информации предоставляет отложенная библиотека для доступа к упакованной функции - PullRequest
3 голосов
/ 31 января 2011

Я знаю, что если я отложу функцию и передам ей несколько аргументов, функция получит эти аргументы и сможет работать с ними, но может ли функция, являющаяся частью экземпляра объекта (например), получить доступ к переменным своего объекта?

class foo (object):
    def __init__ (self):
        self.bar = 42
    def do_work (self):
        self.bar += 1

baz = foo()
deferred.defer(baz.do_work)

Должен ли я в принципе предоставить функции всю информацию, которая понадобится ей в качестве аргументов?
Кроме того, baz был бы удален, если бы единственная ссылка на него была в отложенной функции?

1 Ответ

3 голосов
/ 01 февраля 2011

Если вы передадите метод экземпляра, как в примере кода, весь экземпляр будет сериализован и передан. Любые объекты, на которые ссылается ваш foo объект, также будут сериализованы и т. Д. Любое глобальное состояние - например, переменные уровня модуля и класса - не будет сохранено, поэтому оно будет находиться в любом состоянии, в котором эти переменные находятся в экземпляре, в котором выполняется задача.

Необходимые данные сериализуются и отправляются в очередь задач во время вызова defer, поэтому, если это была ваша единственная ссылка на baz, эта копия baz будет немедленно собрана мусором. Однако это не остановит выполнение отложенной задачи, поскольку она создаст новый экземпляр при десериализации и выполнении задачи.

...