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:
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? P> spécifique et ne fonctionne pas sur Jython. em> p> p>
3 Réponses :
Python a à la fois Comptage de référence em> collection de déchets et cyclique em> la collecte des ordures, et c'est ce dernier que les contrôles de modules car il n'y a pas de références laissées à votre objet après Il y a un indice dans la documentation : "Depuis le collecteur Suppléments EM> Le comptage de référence déjà utilisé dans Python ..." (mon emphase). P> 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: p> Mais si vous faites cela, la deuxième affirmation va tirer. C'est parce que les cycles d'ordures avec gc code>. 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é.
REF = Aucun code>, son
__ del__ code> La méthode est appelée à la suite de son nombre de références allant à zéro. P>
__ del __ code> ne sont pas collectés - voir la documentation pour GC.GARBAGE . P> P>
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. P>
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.
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 em> (le genre que le comptage de référence ne serait pas attrapé) (voir aussi 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. p>
blockQuote> gc code>: p>
Pertinent: Stackoverflow.com/a/52377917/1959808