2009-09-25 8 views
11

Je crée un démon de chat en python et framework tordu. Et je me demande si je dois supprimer toutes les variables créées dans mes fonctions pour économiser de la mémoire à long terme lorsque plusieurs utilisateurs sont connectés, ou ces variables sont-elles automatiquement effacées? Voici une version décomplexée de mon code pour illustrer mon point:Conversation Python: supprimer des variables pour nettoyer la mémoire dans les fonctions?

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

Répondre

16

C Python (implémentation de référence) utilise le comptage de références et la récupération de place. Lorsque le nombre de références à l'objet diminue à 0, il est automatiquement récupéré. La récupération de place récupère normalement uniquement les objets qui se réfèrent les uns aux autres (ou à d'autres objets) et ne peuvent donc pas être récupérés par comptage de références.

Ainsi, dans la plupart des cas, les variables locales sont récupérées à la fin de la fonction, car à la sortie de la fonction, les objets cessent d'être référencés de n'importe où. Vos instructions "del" sont donc complètement inutiles, car Python le fait de toute façon.

+0

tks beaucoup, c'est compris! – plehoux

4

Python utilise la récupération des ordures. Cela signifie que vous n'avez pas besoin de vous soucier de la mémoire car elle est libérée automatiquement lorsqu'elle n'est plus utilisée.

+1

La récupération de place Python est techniquement complètement facultative, dépend de l'implémentation et n'est pas garantie, surtout avec des références circulaires. – Triptych

+0

Les chances sont bonnes que CPython améliore son garbage collector pour qu'il puisse traiter des références circulaires. –

+0

gs: Le garbage collector CPython peut gérer des références circulaires depuis longtemps, depuis la version 2.0. –

7

Les objets Python ne sont jamais supprimés explicitement. La seule façon de vraiment récupérer de la mémoire à partir d'objets Python non référencés est via le garbage collector. Le mot-clé del dissocie simplement un nom d'un objet, mais l'objet doit toujours être récupéré. Si vous pensez vraiment devoir le faire, vous pouvez forcer le ramasse-miettes à utiliser le module gc, mais il s'agit certainement d'une optimisation prématurée, et vous risquez de ramasser les ordures à des moments inopportuns ou inefficaces à moins que vous vraiment sais ce que vous faites. L'utilisation de del comme vous avez ci-dessus n'a aucun effet réel, puisque ces noms auraient été supprimés car ils sont sortis de la portée de toute façon. Vous aurez besoin de suivre avec une collecte de place explicite pour être sûr (r).

Questions connexes