2009-09-25 79 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)。