0Pricing
Go Academy · Ders

Zarif Kapatma

Çalışanları düzgün şekilde durdurun

Zarif Kapatma, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 4. 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, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.

Düzgün Kapatma Neden Önemlidir

Uzun süre çalışan gorutinlere ne zaman duracakları bildirilmelidir. Düzgün kapatma, worker'ların mevcut işi tamamlamasına, kaynakları serbest bırakmasına ve sızıntı ya da veri kaybı olmadan çıkmasına olanak tanır.

  • Gorutin sızıntısı olmaz
  • Yarım kalmış yazma işlemleri olmaz
  • Temiz işlem çıkışı sağlanır

done Kanalı Deseni

Klasik bir yaklaşım done kanalıdır. Bu kanalı kapatmak, onu dinleyen tüm gorutinlere bir durma sinyali yayınlar; çünkü kapalı bir kanal, okuma yapıldığında hemen döner.

done := make(chan struct{})
// ... later
close(done)

Durdurma Sinyalleri için select

Bir worker, ya bir işi işlemek ya da done kanalını fark etmek için select kullanır. done kapandığında ilgili durum çalışır ve worker döner.

for {
    select {
    case <-done:
        return
    case j := <-jobs:
        process(j)
    }
}

context.Context

İdiomatik ve modern araç context'tir. context.WithCancel size bir bağlam ve bir iptal işlevi verir. cancel çağrıldığında bağlamın Done kanalı kapanır.

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

ctx.Done() Üzerinden Dinleme

worker'lar ctx.Done() üzerinde select kullanır. cancel çağrıldığında veya bir son tarih geçtiğinde kanal kapanır ve worker çıkar.

select {
case <-ctx.Done():
    return ctx.Err()
case j := <-jobs:
    process(j)
}

worker'ları Bekleme

Durdurma sinyali göndermek yeterli değildir; worker'ların gerçekten tamamlanmasını beklemelisiniz. sync.WaitGroup worker'ları izler, böylece main, sayı sıfıra ulaşana kadar engellenebilir.

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()
    runWorker(ctx)
}()
// ... later
cancel()
wg.Wait()

context ile Zaman Aşımları

context.WithTimeout, belirli bir sürenin ardından otomatik olarak iptal eder. Bu, zorunlu çıkıştan önce kapatmanın ne kadar sürebileceğini sınırlar.

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

Eksiksiz Düzgün Kapatma

Bu program iki worker çalıştırır, bağlamı iptal eder ve done yazdırmadan önce ikisinin de temiz biçimde çıkmasını bekler.

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func worker(ctx context.Context, id int, wg *sync.WaitGroup) {
    defer wg.Done()
    for {
        select {
        case <-ctx.Done():
            fmt.Printf("worker %d stopping\n", id)
            return
        case <-time.After(50 * time.Millisecond):
        }
    }
}

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    var wg sync.WaitGroup
    for i := 1; i <= 2; i++ {
        wg.Add(1)
        go worker(ctx, i, &wg)
    }
    time.Sleep(120 * time.Millisecond)
    cancel()
    wg.Wait()
    fmt.Println("all workers stopped")
}

Devam Eden İşleri Tamamlama

Kapatma sırasında genellikle worker'ların başlattıkları işi tamamlamasını istersiniz. Kalan işleri son bir döngüde okuyabilir veya mevcut işlerin tamamlanmasına izin verirken yeni iş kabul etmeyi durdurabilirsiniz.

OS Sinyallerini Yakalama

Gerçek sunucularda signal.NotifyContext, iptali SIGINT ve SIGTERM sinyallerine bağlar. Ctrl+C'ye basmak, elle yapılan iptalle aynı düzgün kapatma yolunu tetikler.

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()

cancel() İşlevini Asla Unutmayın

WithTimeout kullanırken bile her zaman defer cancel() kullanın. cancel çağrılmazsa bağlamın dahili gorutini ve zamanlayıcısı, son tarih gelene kadar sızar.

Hızlı Kontrol

Kapatma konusundaki bilginizi test edin.

Özet

Düzgün kapatmayı öğrendiniz:

  • Durdurma sinyali göndermek için context.WithCancel veya bir done kanalı kullanın
  • worker'lar ctx.Done() üzerinde select kullanır
  • WaitGroup tüm worker'ların gerçekten çıkmasını sağlar
  • Gerçek sunucularda iptali OS sinyallerine bağlayın
  • Her zaman defer cancel() kullanın

Sıkça Sorulan Sorular

“Zarif Kapatma” dersi ücretsiz mi?

Evet — “Zarif Kapatma” 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 Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.

“Zarif Kapatma” dersinde ne öğreneceğim?

Çalışanları düzgün şekilde durdurun Go 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.

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

Önceden deneyim gerekmez. CoddyKit'te Go 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 4. dersidir.

“Zarif Kapatma” 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 Go Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Go 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. Çalışan Havuzu Örüntüsü
  2. Fan-Out Fan-In
  3. İşlem Hattı Aşamaları
  4. Zarif Kapatma
← Go Academy Sayfasına Dön