2009-09-25 120 views
11

Estoy creando un daemon de chat en python y twisted framework. Y me pregunto si tengo que eliminar cada variable create en mis funciones para ahorrar memoria a largo plazo cuando se conectan varios usuarios, o esas variables se borran automáticamente. Aquí hay una versión de mi código para mostrar mi punto:Python chat: borrar variables para limpiar la memoria en las funciones?

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

Respuesta

16

C Python (la implementación de referencia) utiliza el recuento de referencias y la recolección de elementos no utilizados. Cuando el recuento de referencias al objeto disminuye a 0, se recupera automáticamente. La recolección de basura normalmente reclama solo aquellos objetos que se refieren entre sí (u otros objetos de ellos) y, por lo tanto, no pueden recuperarse mediante el recuento de referencias.

Por lo tanto, en la mayoría de los casos, las variables locales se recuperan al final de la función, porque a la salida de la función, los objetos dejan de estar referenciados desde cualquier lugar. Entonces sus declaraciones "del" son completamente innecesarias, porque Python lo hace de todos modos.

+0

tks mucho, se entiende! – plehoux

4

Python utiliza la recolección de basura. Esto significa que no tiene que preocuparse por la memoria, ya que se libera automáticamente cuando ya no se usa.

+1

La recolección de basura de Python es técnicamente completamente opcional, depende de la implementación y no se garantiza que suceda, especialmente con referencias circulares. – Triptych

+0

Es probable que CPython vaya a mejorar su recolector de basura a algo que pueda tratar con referencias circulares. –

+0

gs: el recolector de basura CPython puede tratar con referencias circulares durante mucho tiempo, desde la versión 2.0. –

7

Los objetos de Python nunca se eliminan explícitamente. La única manera de recuperar verdaderamente la memoria de objetos Python sin referencia es a través del recolector de basura. La palabra clave del simplemente desvincula un nombre de un objeto, pero el objeto todavía necesita ser basura.

Si realmente piensa que tiene que, se puede forzar el recolector de basura que se ejecute mediante el módulo gc, pero esto es casi seguro que una optimización prematura, y que son muy propensos a recoger la basura en momentos inoportunos o de otra manera ineficiente a menos que realmente sabe lo que está haciendo.

El uso de del como el anterior no tiene ningún efecto real, ya que esos nombres se habrían eliminado ya que salieron de su alcance de todos modos. Debería realizar un seguimiento con una recolección de basura explícita para estar seguro (r).

Cuestiones relacionadas