Sobes.tech
Junior

Python-дағы қоқыс жинағыш (garbage collector) деген не?

sobes.tech AI

AI-дан жауап

Python-дағы қоқыс жинағыш — бұл автоматты түрде жадты басқару механизмі, ол енді сілтемелері жоқ немесе тек циклдік сілтемелерде қатысатын объектілердің жадын босатады.

Python екі негізгі қоқыс жинау механизмін пайдаланады:

  1. Сілтеме санын есептеу (Reference Counting):

    • Әрбір объектінің сілтеме саны бар, ол оған сілтейтін айнымалылар немесе басқа объектілер санын көрсетеді.
    • Егер объектінің сілтеме саны нөлге тең болса, ол қоқыс деп саналады және оның жадын дереу босатады.
    • Бұл қарапайым және тиімді әдіс, бірақ ол циклдік сілтемелер мәселесін шешпейді.
  2. Циклдік сілтемелерді анықтау (Generational Cyclic Garbage Collector):

    • Сілтеме санын есептеуге қосымша жұмыс істейді.
    • Өзара сілтеме жасайтын, бірақ сыртқы сілтемелері жоқ объектілер топтарын анықтайды.
    • Маркировка-жою алгоритмін пайдаланады және бірнеше "ұрпақтар" бойынша жұмыс істейді, бұл оңтайландыру үшін. Жаңа объектілер жас ұрпақта орналасады, және қоқыс жинау жиі жүргізіледі.
# Сілтеме санын есептеу мысалы
a = [] # [] үшін сілтеме саны = 1
b = a  # [] үшін сілтеме саны = 2
c = b  # [] үшін сілтеме саны = 3
del a  # [] үшін сілтеме саны = 2
del b  # [] үшін сілтеме саны = 1
del c  # [] үшін сілтеме саны = 0, жад босатылады
# Циклдік сілтеме мысалы
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        self.prev = None

a = Node(1)
b = Node(2)

a.next = b
b.prev = a
# Мұнда a және b бір-біріне сілтеме жасайды

del a
del b
# a және b үшін сілтеме саны 1-ге тең болады, өзара сілтемелердің арқасында.
# Объектілер әлі де жадта, дегенмен a және b айнымалылары жойылды.
# Циклдік сілтемелерді жинағыш оларды анықтап, босатады.

Қоқыс жинағыш gc модулі арқылы басқарылады. Оны баптауға немесе өшіруге болады, дегенмен әдетте бұл ұсынылмайды.

import gc

# Қоқыс жинағыштың қосулы екенін тексеру
print(gc.isenabled())

# Қоқыс жинағышты қосу/өшіру
# gc.disable()
# gc.enable()

# Қоқыс жинағышты қолмен іске қосу
# gc.collect()