Python chat: удалить переменные для очистки памяти в функциях?
Я создаю чат-демон в python и twisted framework. И мне интересно, нужно ли мне удалять каждую переменную create в моих функциях, чтобы сохранить память в конечном счете, когда подключено несколько пользователей, или эти переменные автоматически очищаются?. Здесь вырезать версию моего кода, чтобы проиллюстрировать мою точку зрения:
class Chat(LineOnlyReceiver):
LineOnlyReceiver.MAX_LENGTH = 500
def lineReceived(self, data):
self.sendMessage(data)
def sendMessage(self, data):
try:
message = data.split(None,1)[1]
except IndexError:
return
self.factory.sendAll(message)
#QUESTION : do i have to delete message and date??????????????????
del message
del data
class ChatFactory(Factory):
protocol = Chat
def __init__(self):
self.clients = []
def addClient(self, newclient):
self.clients.append(newclient)
def delClient(self, client):
self.clients.remove(client)
def sendAll(self, message):
for client in self.clients:
client.transport.write(message + "\n")
Ответы
Ответ 1
C Python (эталонная реализация) использует подсчет ссылок и сбор мусора. Когда количество ссылок на объект уменьшается до 0, оно автоматически восстанавливается. Сбор мусора обычно восстанавливает только те объекты, которые относятся друг к другу (или другие объекты от них) и, следовательно, не могут быть восстановлены путем подсчета ссылок.
Таким образом, в большинстве случаев локальные переменные возвращаются в конце функции, потому что при выходе из функции объекты перестают ссылаться из любой точки. Таким образом, ваши "del" заявления совершенно не нужны, потому что Python все равно это делает.
Ответ 2
Объекты Python никогда не удаляются явно. Единственный способ по-настоящему восстановить память из незарегистрированных объектов Python - через сборщик мусора. Ключевое слово del
просто отталкивает имя от объекта, но объект все еще нуждается в сборке мусора.
Если вы действительно думаете, что это необходимо, вы можете заставить сборщик мусора работать с помощью модуля gc
, но это почти наверняка преждевременная оптимизация, и вы, скорее всего, собираете сбор мусора в неподходящие времена или иным образом неэффективно, если вы действительно не знаете, что делаете.
Использование del
, как у вас выше, не имеет реального эффекта, так как эти имена были бы удалены, поскольку они все равно выходили за рамки. Вам нужно будет следить за явной сборкой мусора (r).
Ответ 3
Python использует сборку мусора. Это означает, что вам не нужно заботиться о памяти, поскольку она автоматически освобождается, когда она больше не используется.