Python chat: удалить переменные для очистки памяти в функциях?

Я создаю демон чата в python и twisted framework. И мне интересно, нужно ли удалять каждую переменную, созданную в моих функциях, чтобы сохранить память в долгосрочной перспективе, когда подключено несколько пользователей, или эти переменные автоматически очищаются?. Вот разделенная версия моего кода, чтобы проиллюстрировать мою точку зрения:

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

3 ответов


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

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


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

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

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


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