11

我正在 python 和扭曲的框架中创建一个聊天守护程序。而且我想知道当连接多个用户时,我是否必须删除函数中创建的每个变量以从长远来看节省内存,或者这些变量是否会自动清除?这是我的代码的精简版本来说明我的观点:

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

3 回答 3

16

C Python(参考实现)使​​用引用计数和垃圾收集。当对对象的引用计数减少到 0 时,它会被自动回收。垃圾收集通常只回收那些相互引用的对象(或来自它们的其他对象),因此不能通过引用计数来回收。

因此,在大多数情况下,局部变量在函数结束时被回收,因为在函数退出时,对象不再被任何地方引用。所以你的“del”语句是完全没有必要的,因为 Python 无论如何都会这样做。

于 2009-09-25T15:52:17.397 回答
7

Python 对象永远不会被显式删除。真正从未引用的 Python 对象中回收内存的唯一方法是通过垃圾收集器。关键字只是将del名称与对象解除绑定,但该对象仍需要进行垃圾回收。

如果您真的认为必须这样做,您可以强制垃圾收集器使用该gc模块运行,但这几乎可以肯定是一种过早的优化,并且您很可能在不合时宜的时候进行垃圾收集或以其他方式效率低下,除非您真的知道自己在做什么重新做。

像上面那样使用del没有实际效果,因为这些名称无论如何都会被删除,因为它们超出了范围。您需要跟进明确的垃圾收集以确保(r)。

于 2009-09-25T15:44:19.140 回答
4

Python 使用垃圾收集。这意味着您不必关心内存,因为它在不再使用时会自动释放。

于 2009-09-25T15:28:37.493 回答