2009-09-25 96 views
11

我在Python和扭曲的框架中创建聊天守护进程。而且我想知道是否必须删除函数中的每个变量create,以便在多个用户连接的情况下长时间保存内存,或者这些变量是否自动清除?下面是我的代码的一个剥离版本来说明我的观点: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") 

回答

16

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

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

+0

很多,据了解! – plehoux 2009-09-29 04:15:05

4

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

+1

Python垃圾收集在技术上完全是可选的,依赖于实现,并且不保证永远发生,特别是对于循环引用。 – Triptych 2009-09-25 15:37:42

+0

CPython将改善其垃圾回收器,以便处理循环引用。 – 2009-09-25 16:00:53

+0

gs:从约2.0版本开始,CPython垃圾回收器可以长时间处理循环引用。 – 2009-09-26 16:48:51

7

Python对象从不显式删除。从未引用的Python对象真正回收内存的唯一方法是通过垃圾回收器。关键字del只是简单地从对象中取消绑定名称,但该对象仍然需要进行垃圾回收。

如果你真的认为你必须这样做,你可以使用gc模块强制垃圾收集器运行,但这几乎肯定是不成熟的优化,而且你很可能在不合时宜的时候收集垃圾,否则就会效率低下,除非你真的知道你在做什么。

如上所述使用del没有实际效果,因为无论如何,这些名称都会被删除。你需要跟进一个明确的垃圾收集,以确保(r)。