7
votes

Pourquoi le destructeur est-il appelé lorsque le collecteur de poubelles CPPHON est désactivé?

J'essaie de comprendre les internes du collecteur de poubelles CPPHON, en particulier lorsque le destructeur est appelé. Jusqu'à présent, le comportement est intuitif, mais le cas suivant m'envoie:

  1. Désactiver le GC.
  2. Créez un objet, puis retirez-la une référence.
  3. L'objet est détruit et la méthode _____Del_____ est appelée.

    Je pensais que cela ne se produirait que si le collecteur des ordures était activé. Quelqu'un peut-il expliquer pourquoi cela se produit? Y a-t-il un moyen de différer appeler le destructeur? xxx

    spécifique et ne fonctionne pas sur Jython.


1 commentaires

3 Réponses :


11
votes

Python a à la fois Comptage de référence collection de déchets et cyclique la collecte des ordures, et c'est ce dernier que les contrôles de modules gc . Le comptage de référence ne peut pas être désactivé, et il arrive donc toujours lorsque le collecteur de déchets cycliques est désactivé.

car il n'y a pas de références laissées à votre objet après REF = Aucun , son __ del__ La méthode est appelée à la suite de son nombre de références allant à zéro.

Il y a un indice dans la documentation : "Depuis le collecteur Suppléments Le comptage de référence déjà utilisé dans Python ..." (mon emphase).

vous Peut arrêter la première affirmation de la cuisson en rendant l'objet se référer à lui-même, de sorte que son nombre de références ne passe pas à zéro, par exemple en lui donnant ce constructeur: xxx

Mais si vous faites cela, la deuxième affirmation va tirer. C'est parce que les cycles d'ordures avec __ del __ ne sont pas collectés - voir la documentation pour GC.GARBAGE .


0 commentaires

4
votes

Selon votre définition du collecteur des ordures, CPPHON dispose de deux collectionneurs à déchets, la référence en comptant un, et l'autre.
Le compteur de référence fonctionne toujours et ne peut pas être éteint, car il est assez rapide et léger qui n'affecte pas de manière significative sur le temps d'exécution du système.
L'autre (une variante de marque et de balayage, je pense), devient courir de temps en temps, et peut être handicapé. En effet, cela nécessite que l'interprète soit en pause pendant son fonctionnement, ce qui peut arriver au mauvais moment et consomme beaucoup de temps de processeur.
Cette capacité à désactiver est là pour ces temps où vous vous attendez à faire quelque chose de temps critique, et le manque de ce GC ne vous causera aucun problème.


2 commentaires

Est-ce que ce "deux collectionneurs à déchets" est-il documenté quelque part?


Regardez la réponse de Alex Martelli et de ses liens associés. C'est probablement mieux que tout ce que je pouvais trouver.



5
votes

the docs ici (original Le lien était d'une section de documentation qui jusqu'à Python 3.5 était voici , et a été plus tard relocated ) Expliquez comment ce qu'on appelle "la facultative Collectionneur des ordures "est en fait un collecteur de la poubelle cyclique (le genre que le comptage de référence ne serait pas attrapé) (voir aussi ICI ). Le comptage de référence est expliqué ici , avec un signe de tête à son interplement avec le cyclique gc :

Pendant que Python utilise le traditionnel mise en œuvre de comptage de référence, il offre également un détecteur de cycle qui Travaille pour détecter les cycles de référence. Cette permet aux applications de ne pas vous inquiéter de créer une circulaire directe ou indirecte les références; Ce sont la faiblesse de Collecte des ordures mises en œuvre en utilisant seulement le comptage de référence. Référence Les cycles sont constitués d'objets qui contenir des références (éventuellement indirectes) pour eux-mêmes, de sorte que chaque objet dans Le cycle a un compte de référence qui n'est pas zéro. Référence typique Compter les implémentations ne sont pas capables récupérer la mémoire appartenant à tout objets dans un cycle de référence, ou référencé des objets dans le cycle, même s'il n'y a pas de Références supplémentaires au cycle lui-même.


0 commentaires