Подтвердить что ты не робот

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")
4b9b3361

Ответ 1

C Python (эталонная реализация) использует подсчет ссылок и сбор мусора. Когда количество ссылок на объект уменьшается до 0, оно автоматически восстанавливается. Сбор мусора обычно восстанавливает только те объекты, которые относятся друг к другу (или другие объекты от них) и, следовательно, не могут быть восстановлены путем подсчета ссылок.

Таким образом, в большинстве случаев локальные переменные возвращаются в конце функции, потому что при выходе из функции объекты перестают ссылаться из любой точки. Таким образом, ваши "del" заявления совершенно не нужны, потому что Python все равно это делает.

Ответ 2

Объекты Python никогда не удаляются явно. Единственный способ по-настоящему восстановить память из незарегистрированных объектов Python - через сборщик мусора. Ключевое слово del просто отталкивает имя от объекта, но объект все еще нуждается в сборке мусора.

Если вы действительно думаете, что это необходимо, вы можете заставить сборщик мусора работать с помощью модуля gc, но это почти наверняка преждевременная оптимизация, и вы, скорее всего, собираете сбор мусора в неподходящие времена или иным образом неэффективно, если вы действительно не знаете, что делаете.

Использование del, как у вас выше, не имеет реального эффекта, так как эти имена были бы удалены, поскольку они все равно выходили за рамки. Вам нужно будет следить за явной сборкой мусора (r).

Ответ 3

Python использует сборку мусора. Это означает, что вам не нужно заботиться о памяти, поскольку она автоматически освобождается, когда она больше не используется.