0Pricing
Python Academy · Ders

Çöp Toplayıcı ve Döngüsel Başvurular

gc modülünün başvuru döngülerini nasıl ele aldığını öğrenin.

Çöp Toplayıcı ve Döngüsel Başvurular, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.

Referans Sayımı Neden Yeterli Değil

Referans sayımı, referans döngülerine dahil olan nesneleri toplayamaz; her biri diğerine referans tuttuğu için hiçbirinin sayısı 0'a düşmez.

# Reference cycle: a → b → a
a = {}
b = {"other": a}
a["other"] = b
del a, b
# Both objects are unreachable but refcount > 0
# Only the cyclic GC can collect them

gc Modülü

gc, döngüsel çöp toplayıcıdır. İzlenen nesneleri ulaşılamayan döngüler için düzenli aralıklarla tarar ve bunları toplar.

import gc

gc.collect()   # trigger immediately
print(gc.garbage)   # objects with __del__ in cycles (cannot auto-collect)

Nesil Tabanlı Toplama

Çöp toplayıcı üç nesil kullanır. Yeni nesneler 0. nesilde başlar. Bir toplama işleminden sağ çıkan nesneler daha üst bir nesle aktarılır. 0. nesil en sık toplanır.

import gc

print(gc.get_count())     # (gen0, gen1, gen2) allocations since last collection
print(gc.get_threshold()) # (700, 10, 10) — thresholds for each generation
gc.set_threshold(1000, 15, 10)  # tune

gc.get_referents ile Döngüleri Belirleme

Bir nesnenin hangi nesnelere referans verdiğini inceleyin; bu, bir şeyin neden toplanmadığını anlamak için kullanışlıdır.

import gc

a = []
b = [a]
a.append(b)

for ref in gc.get_referents(a):
    print(ref)   # shows b

gc.get_objects()

gc.get_objects(), çöp toplayıcı tarafından şu anda izlenen tüm nesneleri döndürür. Bellek sızıntılarını bulmak için kullanışlıdır.

import gc

before = len(gc.get_objects())
create_lots_of_objects()
after = len(gc.get_objects())
print(f"Leaked: {after - before} objects")

Döngülerden Kaçınma

Veri yapılarını döngülerden kaçınacak şekilde tasarlayın: geri başvurular için zayıf referanslar kullanın, doğrudan referanslar yerine kimlikler kullanın veya nesneler kapsam dışına çıkmadan önce döngüleri açıkça kırın.

import weakref

class Node:
    def __init__(self, parent):
        # weakref avoids cycle:
        self.parent = weakref.ref(parent)

class Tree:
    def __init__(self):
        self.child = Node(self)   # no hard cycle

__del__ ve Döngüler

Bir döngüye dahil olan __del__ içeren nesneler otomatik olarak toplanamaz. Bunun yerine gc.garbage içine yerleştirilir.

import gc

class Leaky:
    def __del__(self): pass

a = Leaky()
b = Leaky()
a.other = b
b.other = a
del a, b

gc.collect()
print(gc.garbage)   # [Leaky, Leaky] — cannot collect

gc.freeze() — Python 3.7+

gc.freeze(), şu anda izlenen nesneleri dondurur; böylece bu nesneler hiçbir zaman toplanmaz. Uzun süre çalışan işlemlerde başlangıçtan sonra çöp toplayıcı duraklamalarını azaltmak için kullanışlıdır.

import gc

# After all globals and imports are in place:
gc.freeze()   # no GC scanning for these objects ever again

# Useful for: gunicorn pre-fork, background servers

Çöp Toplayıcıyı Devre Dışı Bırakma ve Yeniden Etkinleştirme

Hiçbir döngünün bulunmadığını bildiğiniz sıkı döngülerde döngüsel çöp toplayıcıyı devre dışı bırakın; ardından yeniden etkinleştirip sonrasında bir toplama işlemini zorlayın.

import gc

gc.disable()
try:
    result = tight_loop_no_cycles()
finally:
    gc.enable()
    gc.collect()

isenabled ve isfinalized

Çöp toplayıcının durumunu gc.isenabled() ile denetleyin ve bir nesnenin sonlandırılıp sonlandırılmadığını gc.is_finalized(obj) ile belirleyin.

import gc

print(gc.isenabled())      # True by default
obj = object()
print(gc.is_finalized(obj))  # False (still alive)

Bellek Sızıntısı Örüntüleri

Yaygın Python bellek sızıntısı nedenleri şunlardır: sınırsız büyüyen genel önbellekler, ayrılmayan olay dinleyicileri, __del__ içeren referans döngüleri ve referans sızdıran C uzantıları.

# Typical leaks:
global_cache = {}   # grows forever — use lru_cache with maxsize

class EventBus:
    listeners = []
    # Listeners hold references to objects:
    # @classmethod
    # def on(cls, fn): cls.listeners.append(fn)
    # Must call off() to detach

Hızlı Kontrol

Bir referans döngüsüne dahil olan __del__ içeren nesnelere ne olur?

Özet

Döngüsel çöp toplayıcı, referans sayımının ele alamadığı referans döngülerini yönetir. Üç nesil kullanır ve hayatta kalan nesneleri üst nesillere aktarır. Zayıf referanslarla döngülerden kaçının. Döngülerdeki __del__ içeren nesneler gc.garbage içine yerleştirilir. Uzun süre çalışan sunucularda çöp toplayıcı duraklamalarını azaltmak için başlangıçtan sonra gc.freeze() kullanın.

Sıkça Sorulan Sorular

“Çöp Toplayıcı ve Döngüsel Başvurular” dersi ücretsiz mi?

Evet — “Çöp Toplayıcı ve Döngüsel Başvurular” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.

“Çöp Toplayıcı ve Döngüsel Başvurular” dersinde ne öğreneceğim?

gc modülünün başvuru döngülerini nasıl ele aldığını öğrenin. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Python Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Çöp Toplayıcı ve Döngüsel Başvurular” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. CPython Başvuru Sayımı
  2. Çöp Toplayıcı ve Döngüsel Başvurular
  3. cProfile ve line_profiler ile Profil Oluşturma
  4. tracemalloc ile Bellek Profili Oluşturma
← Python Academy Sayfasına Dön