2009-09-25 3 views
11

Ich erstelle einen Chat-Daemon in Python und Twisted-Framework. Und ich frage mich, ob ich jede Variable löschen muss, die in meinen Funktionen erstellt wurde, um auf lange Sicht Speicher zu sparen, wenn mehrere Benutzer verbunden sind, oder werden diese Variablen automatisch gelöscht ?. Hier ist ein Streifen abgespeckte Version meines Codes mein Punkt zu illustrieren:Python Chat: Variablen löschen, um Speicher in Funktionen zu reinigen?

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

Antwort

16

C Python (die Referenzimplementierung) verwendet Referenzzählung und der Garbage Collection. Wenn die Anzahl der Objektverweise auf 0 sinkt, wird sie automatisch zurückgenommen. Die Speicherbereinigung ruft normalerweise nur die Objekte ab, die sich aufeinander beziehen (oder andere Objekte von ihnen) und kann daher nicht durch Referenzzählung zurückgewonnen werden.

Daher werden in den meisten Fällen lokale Variablen am Ende der Funktion zurückgewonnen, da die Objekte beim Verlassen der Funktion nicht mehr von irgendwo referenziert werden. Deine "del" -Anweisungen sind also völlig unnötig, weil Python das sowieso macht.

+0

tks viel, es ist verstanden! – plehoux

4

Python Garbage Collection verwendet. Das bedeutet, dass Sie sich nicht um das Gedächtnis kümmern müssen, da es automatisch freigegeben wird, wenn es nicht mehr verwendet wird.

+1

Die Python-Speicherbereinigung ist technisch vollständig optional, ist implementierungsabhängig und wird insbesondere bei Zirkelverweisen nicht garantiert. – Triptych

+0

Die Chancen stehen gut, dass CPython wird seine Garbage Collector, um etwas zu verbessern, die mit zirkulären Referenzen umgehen kann. –

+0

gs: CPython Garbage Collector mit zirkulären Referenzen für eine lange lange Zeit umgehen kann, da Version etwa 2,0. –

7

Python-Objekte werden nie explizit gelöscht. Die einzige Möglichkeit, Speicher von nicht referenzierten Python-Objekten wiederherzustellen, ist der Garbage Collector. Das Schlüsselwort del entbindet einfach einen Namen von einem Objekt, aber das Objekt muss immer noch als Garbage Collected erfasst werden.

Wenn Sie wirklich denken, dass Sie müssen, können Sie den Garbage Collector mit dem gc-Modul erzwingen, aber dies ist mit ziemlicher Sicherheit eine vorzeitige Optimierung, und Sie sind sehr wahrscheinlich Müll zu unpassenden Zeiten sammeln oder anderweitig ineffizient, es sei denn Sie wirklich wissen, was Sie tun.

Mit del wie Sie oben haben keine wirkliche Wirkung, da diese Namen gelöscht worden wäre, als sie ohnehin außerhalb des Bereichs ging. Sie müssen eine explizite Garbage Collection durchführen, um sicher zu gehen (r).