Вопросы по Twisted Protocols и loopingCall

58
6

Предположим, у меня есть приложение с витой поддержкой python со стандартными подклассами Factory и Protocol. Мой метод подкласса ProtocolMade() запускает цикл looping, который запускается (скажем) каждые 5 минут. У меня есть два вопроса:

Предположим, что соединение потеряно. Да, я знаю, что это приведет к вызову метода connectionLost(). Но что происходит с самим объектом протокола? Когда это прекратится? Сразу ли получается сбор мусора? Что происходит с loopingCall в этом протоколе? Если я не отменю его явно, значит ли это, что он работает постоянно и не позволяет протоколу собирать мусор?

спросил(а) 2015-04-15T23:00:00+03:00 5 лет, 6 месяцев назад
1
Решение
82

Вещи получают мусор, когда больше нет ссылок на них, поэтому я не могу сказать, когда будут собраны объекты в вашей программе.

Однако я могу рассказать вам о ссылках, хранящихся у Twisted.

Protocol связанный с Transport будет иметь ссылку, которая будет содержать глобальные переменные → реактор → транспорт → протокол. Когда транспорт закрыт, ссылка от реактора на транспорт нарушена. Реактор ссылается только на транспорт для доставки к нему событий, а поскольку отсоединенный транспорт не имеет никаких условий для доставки, реактор может его сбросить. Протокол поэтому больше не ссылается на реактор. В этот момент, если никакие другие глобальные переменные или активные переменные стека не ссылаются на него, они будут собраны.

На LoopingCall ссылаются глобальные переменные → реактор → DelayedCall (объект, возвращаемый callLater) → LoopingCall.__call__ bound method → LoopingCall. Если LoopingCall f (вызываемый вызов) по-прежнему ссылается на ваш Protocol, то да, ваш объект Protocol будет продолжать жить в памяти. Но, поскольку у него больше нет полезного transport, вы не можете с ним справиться.

ответил(а) 2015-04-16T06:38:00+03:00 5 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема